using Oracle.ManagedDataAccess.Client; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.IO; using System.Net; using System.Runtime.InteropServices; using System.Text; using System.Text.RegularExpressions; using System.Web.Script.Serialization; namespace UMESDLLService { [Guid("974DEAD2-9D4C-4728-87EA-2407752E300F")] [InterfaceType(ComInterfaceType.InterfaceIsDual)] public interface IMESHelper { [DispId(12)] bool CheckRoutePassed(string iSN, string iResCode, out string oErrMessage); bool GetRcardMOInfo(string iSN, out string oMoCode, out string oErrMessage); bool CheckUserAndResourcePassed(string iUserCode, string iResCode, string iPassWord, out string oErrMessage); bool GetAddressRangeByMO(string iSN, out string oInfo, out string oErrMessage); bool SetAddressInfo(string iSN, string iMac, string iBT, string iCode1, string iCode2, string iCode3, out string oErrorMessage); bool SetTestDetail(string iSN, string iTestResult, string iResCode, string[,] iTestDetail, out string oErrMessage); bool GetMEIOrNetCodeRange(string iSnCode, string iIMEI1, string iNetCode, out string oInfo, out string oErrMessage); bool SetIMEIInfo(string iSN, string iIMEI1, string iIMEI2, string iIMEI3, string iMEID, string iPSN, string iNETCODE, string iID1, string iID2, string iID3, out string oErrMessage); bool GetMobileAllInfo(string iSnCode, out string oInfo, out string oErrorMessage); bool SetMobileData(string iTSN, string iSN, string iSourceCode, string iOperator, string iResult, string iErrCode, string flag, out string oErrorMessage); bool SetPcbaData(string iSN, string iResCode, string iOperator, string iResult, string iErrCode, out string oErrMessage); bool GoMo(string iMO, string iSN, string iResCode, out string oErrMessage); bool GetInfoByMaterial(string iPCBA, out string oSN, out string oErrMessage); bool GetSoftVersion(string iSN, out string oSoftVersion, out string oErrMessage); } [Guid("5379A8F6-EB38-4A2B-9050-52AD9757E12D")] [ComSourceInterfaces(typeof(IMESHelper))] [ClassInterface(ClassInterfaceType.None)] [ProgId("UMES.DllService.MESHelper")] public class MESHelper : IMESHelper { //用于拼接SQL StringBuilder sql = new StringBuilder(); //用于存放批量执行的SQL List sqls = new List(); string Master = "N_MES"; //系统默认的的连接字符串 private string ConnectionStrings = "Connection Timeout=0;Pooling=false;Password=select!#%*(;User ID=MES;Pooling=false;Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=10.1.81.208)(PORT=11568)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=orcl)));"; //用户选择的数据库的连接字符串 private OracleConnection connection; //用户选择的数据库的连接字符串 private OracleCommand command = null; public MESHelper() { connection = new OracleConnection(ConnectionStrings); } public MESHelper(string IP) { connection = new OracleConnection("Data Source=" + IP + "/orcl;User ID=N_MES;PassWord=select!#%*(;"); } [Description("获取工单软件版本")] public bool GetSoftVersion(string iMakeCode, out string oSoftVersion, out string oErrMessage) { string oMakeCode = ""; oErrMessage = ""; oSoftVersion = ""; //GetRcardMOInfo(iSN, out oMakeCode, out oErrMessage); if (!CheckExist("Make", "ma_Code='" + iMakeCode + "'")) { oErrMessage = "工单号" + iMakeCode + "不存在"; return false; } oSoftVersion = getFieldDataByCondition("make", "ma_softversion", "ma_code='" + iMakeCode + "'").ToString(); return true; } public bool GetInfoByMaterial(string iPCBA, out string oSN, out string oErrMessage) { oSN = ""; oErrMessage = ""; if (iPCBA == "") { oErrMessage = "主板SN不能为空"; } DataTable dt = (DataTable)ExecuteSql("select ms_firstsn,ms_sncode from CRAFTMATERIAL left join make on cm_makecode=ma_code " + "left join makeserial on ms_firstsn=cm_firstsn and cm_makecode=ms_makecode where cm_barcode='" + iPCBA + "' and nvl(cm_status,0)<>-1 order by cm_id desc", "select"); if (dt.Rows.Count > 0) { oSN = dt.Rows[0]["ms_sncode"].ToString(); } else { oErrMessage = "主板SN未查询到关联信息"; } if (oErrMessage == "" || oErrMessage == null || oErrMessage == "null") { return true; } else return false; } /// /// 检测当前的岗位资源对应的工序 /// /// /// /// /// [Description("序列号对应工序检测")] public bool CheckRoutePassed(string iSN, string iResCode, out string oErrMessage) { if (iSN == "") { oErrMessage = "SN不能为空"; return false; } string SNcode = iSN; DataTable dt = (DataTable)ExecuteSql("select ms_sncode from makeserial where ms_sncode='" + iSN + "' or ms_imei1='" + iSN + "' or ms_imei2='" + iSN + "' order by ms_id desc", "select"); if (dt.Rows.Count > 0) { iSN = dt.Rows[0]["ms_sncode"].ToString(); } if (iSN == "") { iSN = SNcode; } oErrMessage = ""; string[] param = new string[] { "", iResCode, iSN, "", "", "", oErrMessage }; string[] ParamName = new string[] { "v_i_macode", "v_i_sourcecode", "v_i_sncode", "v_i_usercode", "v_o_macode", "v_o_msid", "v_o_errmsg" }; CallProcedure("CS_CHECKSTEPSNANDMACODE", ParamName, ref param); oErrMessage = param[6]; dt = (DataTable)ExecuteSql("select ms_status,ms_stepcode,ms_nextstepcode from makeserial where ms_id=( select max(ms_id) from makeserial where ms_sncode in ( select '" + iSN + "' from dual union select sn from makesnrelation where beforesn='" + iSN + "' and sn<>' ' union select beforesn from makesnrelation where sn='" + iSN + "' and beforesn<>' '))", "select"); string ms_status = ""; string ms_stepcode = ""; string ms_nextstepcode = ""; if (dt.Rows.Count > 0) { ms_status = dt.Rows[0]["ms_status"].ToString(); ms_stepcode = dt.Rows[0]["ms_stepcode"].ToString(); ms_nextstepcode = dt.Rows[0]["ms_nextstepcode"].ToString(); } string stepcode = GetStepCodeBySource(iResCode); if (ms_nextstepcode != "" && ms_nextstepcode != stepcode) { oErrMessage = "当前序列号" + iSN + "下一工序" + ms_nextstepcode; return false; } if (oErrMessage == "" || oErrMessage == null || oErrMessage == "null" || (ms_status == "3" && stepcode == ms_stepcode)) { if (ms_status == "3") { oErrMessage = ""; } DataTable dt1 = (DataTable)ExecuteSql("select 1 from makebadcount where mbc_sncode='" + iSN + "' and mbc_stepcode='" + stepcode + "' and mbc_status=0", "select"); int BadCount = dt1.Rows.Count; //测试不良3次不允许再测试,必须先维修 if (BadCount == 3) { oErrMessage = stepcode + "连续三次测试不良,请进行维修"; return false; } return true; } else return false; } /// /// 验证用户身份信息 /// /// /// /// private bool CheckUserLogin(string iUserCode, string iPassWord, out string oErrorMessage) { oErrorMessage = ""; string SQL = "select em_code from employee where em_code=:UserName and em_password =:PassWord"; DataTable dt; dt = (DataTable)ExecuteSql(SQL, "select", iUserCode, iPassWord); if (dt.Rows.Count > 0) return true; else { oErrorMessage = "用户名或者密码不正确!"; return false; } } /// /// 验证用户身份信息和岗位资源 /// /// /// /// /// [Description("验证身份信息")] public bool CheckUserAndResourcePassed(string iUserCode, string iResCode, string iPassWord, out string oErrMessage) { oErrMessage = ""; if (iUserCode == "" || iPassWord == "" || iResCode == "") { oErrMessage = "用户名,密码,岗位资源必须填写"; return false; } if (CheckUserLogin(iUserCode, iPassWord, out oErrMessage)) { string SQL = "select em_code,em_type,em_name from employee where em_code=:UserName "; DataTable dt; dt = (DataTable)ExecuteSql(SQL, "select", iUserCode); if (dt.Rows.Count > 0) { string em_name = dt.Rows[0]["em_name"].ToString(); string em_type = dt.Rows[0]["em_type"].ToString(); if (iResCode == "") { oErrMessage = "岗位资源不允许为空"; return false; } if (em_type == "admin") { if (CheckExist("Source", "sc_code='" + iResCode + "' and sc_statuscode='AUDITED'")) { return true; } else { oErrMessage = "岗位资源编号错误或者未审核!"; return false; } } else { dt = getFieldsDatasByCondition("cs$empgroup left join cs$userresource on ur_groupcode=eg_groupcode left join source on ur_resourcecode=sc_code", new string[] { "ur_resourcecode" }, "eg_emcode = '" + iUserCode + "' and sc_statuscode='AUDITED'"); //如果存在该编号 if (dt.Rows.Count > 0) { //判断如果多个岗位资源存在,用户输入的只要在其中就行 for (int i = 0; i < dt.Rows.Count; i++) { if (dt.Rows[i]["ur_resourcecode"].ToString() == iResCode) return true; } oErrMessage = "用户不处于当前资源所属分组!"; } else oErrMessage = "岗位资源编号错误或者未审核!"; } } else oErrMessage = "用户不存在!"; } return false; } /// /// 分配Mac地址和BT地址 /// /// /// /// /// /// /// /// /// [Description("分配MAC和BT信息")] public bool GetAddressRangeByMO(string iSN, out string oInfo, out string oErrMessage) { oInfo = ""; string oWIFI = ""; string oBT = ""; string oCode1 = ""; string oCode2 = ""; string oCdoe3 = ""; if (iSN == "") { oErrMessage = "SN不能为空"; return false; } oErrMessage = ""; string omakeCode = ""; GetRcardMOInfo(iSN, out omakeCode, out oErrMessage); string[] param = new string[] { iSN, omakeCode, oWIFI, oBT, oCode1, oCode2, oCdoe3, oErrMessage }; string[] ParamName = new string[] { "v_i_sncode", "v_i_macode", "v_o_mac", "v_o_bt", "v_o_code1", "v_o_code2", "v_o_code3", "v_o_errmsg" }; CallProcedure("CS_GETADDRESSBYMAKECODE", ParamName, ref param); oInfo += "MAC:" + param[2].ToString() + "^".Replace("null", ""); oInfo += "BT:" + param[3].ToString() + "^".Replace("null", ""); oInfo += "Code1:" + param[4].ToString() + "^".Replace("null", ""); oInfo += "Code2:" + param[5].ToString() + "^".Replace("null", ""); oInfo += "Code3:" + param[6].ToString() + ""; oErrMessage = param[7]; if (oErrMessage == "" || oErrMessage == null || oErrMessage == "null") return true; else return false; } /// /// 输入的 SN 号查找在制品是否有 IMEI 信息存在,如果存在则将 IMEI 信息传出,如果没有则在该工单下未使用的 IMEI 中随机分配一组 /// 如果iIMEI1、iNetCode不为空,则分别作为获取的附件加条件。 /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// [Description("分配IMEI和NetCode信息")] public bool GetMEIOrNetCodeRange(string iSN, string iIMEI1, string iNetCode, out string oInfo, out string oErrMessage) { oInfo = ""; string oIMEI1 = ""; string oIMEI2 = ""; string oMEID = ""; string oNetCode = ""; string oPSN = ""; string oID1 = ""; string oID2 = ""; string oID3 = ""; if (iSN == "") { oErrMessage = "SN不能为空"; return false; } oErrMessage = ""; string[] param = new string[] { iSN, "", iIMEI1, iNetCode, oIMEI1, oIMEI2, "", oMEID, oNetCode, oPSN, oID1, oID2, oID3, oErrMessage }; string[] ParamName = new string[] { "v_i_sncode", "v_i_macode", "v_i_imei", "v_i_netcode", "v_o_imei1", "v_o_imei2", "v_o_imei3", "v_o_meid", "v_o_netcode", "v_o_psn", "v_o_id1", "v_o_id2", "v_o_id3", "v_o_errmsg" }; CallProcedure("CS_GETIMEIORNETCODERANGE", ParamName, ref param); oInfo += "IMEI1:" + param[4].ToString() + "^".Replace("null", ""); oInfo += "IMEI2:" + param[5].ToString() + "^".Replace("null", ""); oInfo += "MEID:" + param[7].ToString() + "^".Replace("null", ""); oInfo += "NETCODE:" + param[8].ToString() + "^".Replace("null", ""); oInfo += "PSN:" + param[9].ToString() + "^".Replace("null", ""); oInfo += "ID1:" + param[10].ToString() + "^".Replace("null", ""); oInfo += "ID2:" + param[11].ToString() + "^".Replace("null", ""); oInfo += "ID3:" + param[12].ToString() + "".Replace("null", ""); oErrMessage = param[13]; if (oErrMessage == "" || oErrMessage == null || oErrMessage == "null") return true; else return false; } /// /// 获取工单的最近一条执行记录 /// /// /// /// /// [Description("获取序列号对应工单信息")] public bool GetRcardMOInfo(string iSN, out string oMoCode, out string oErrMessage) { //取MakeProcess表中的执行记录ID最大的一个工单的号码 oMoCode = ""; if (iSN == "") { oErrMessage = "SN不能为空"; return false; } oErrMessage = ""; sql.Clear(); sql.Append("select max(ms_id) from makeserial where ms_sncode in (select '" + iSN + "' from dual union select sn from "); sql.Append("makesnrelation where beforesn='" + iSN + "' and sn<>' ' union select beforesn from makesnrelation where sn='" + iSN + "' and beforesn<>' ')"); DataTable dt = (DataTable)ExecuteSql(sql.ToString(), "select"); string ms_id = dt.Rows[0][0].ToString(); oMoCode = getFieldDataByCondition("MakeSerial", "ms_makecode", "ms_id='" + ms_id + "'").ToString(); if (oMoCode != "") return true; else { oErrMessage = "序列号:" + iSN + " 未归属工单"; return false; } } /// /// 获取序列号的所有串号信息 /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// [Description("查询已分配的信息")] public bool GetMobileAllInfo(string iSN, out string oJson, out string oErrMessage) { JavaScriptSerializer jss = new JavaScriptSerializer(); Dictionary oInfo = new Dictionary(); oErrMessage = ""; oJson = ""; if (iSN == "") { oErrMessage = "SN不能为空"; return false; } DataTable dt = (DataTable)ExecuteSql("select ms_sncode from makeserial where ms_sncode='" + iSN + "' or ms_firstsn='" + iSN + "' or ms_imei1='" + iSN + "' or ms_imei2='" + iSN + "' order by ms_id desc", "select"); if (dt.Rows.Count > 0) { iSN = dt.Rows[0]["ms_sncode"].ToString(); } string MacInfo; //if (!GetAddressRangeByMO(iSN, out MacInfo, out oErrMessage)) //{ // if (oErrMessage == "" || oErrMessage == null || oErrMessage == "null") // return true; // else // return false; //} //string MAC = MacInfo.Split('^')[0].Replace("MAC:", ""); //string BT = MacInfo.Split('^')[1].Replace("BT:", ""); //string TCode1 = MacInfo.Split('^')[2].Replace("Code1:", ""); //string TCode2 = MacInfo.Split('^')[3].Replace("Code2:", ""); //string TCode3 = MacInfo.Split('^')[4].Replace("Code3:", ""); //if (!SetAddressInfo(iSN, MAC == "null" ? "" : MAC, BT == "null" ? "" : BT, TCode1 == "null" ? "" : TCode1, TCode2 == "null" ? "" : TCode2, TCode3 == "null" ? "" : TCode3, out oErrMessage)) //{ // if (oErrMessage == "" || oErrMessage == null || oErrMessage == "null") // return true; // else // return false; //} string ImeiInfo; if (!GetMEIOrNetCodeRange(iSN, "", "", out ImeiInfo, out oErrMessage)) { if (oErrMessage == "" || oErrMessage == null || oErrMessage == "null") return true; else return false; } string IMEI1 = ImeiInfo.Split('^')[0].Replace("IMEI1:", ""); string IMEI2 = ImeiInfo.Split('^')[1].Replace("IMEI2:", ""); string MEID = ImeiInfo.Split('^')[2].Replace("MEID:", ""); string NETCODE = ImeiInfo.Split('^')[3].Replace("NETCODE:", ""); string PSN = ImeiInfo.Split('^')[4].Replace("PSN:", ""); string ID1 = ImeiInfo.Split('^')[5].Replace("ID1:", ""); string ID2 = ImeiInfo.Split('^')[6].Replace("ID2:", ""); string ID3 = ImeiInfo.Split('^')[7].Replace("ID3:", ""); if (!SetIMEIInfo(iSN, IMEI1 == "null" ? "" : IMEI1, IMEI2 == "null" ? "" : IMEI2, "", MEID == "null" ? "" : MEID, PSN == "null" ? "" : PSN, NETCODE == "null" ? "" : NETCODE, ID1 == "null" ? "" : ID1, ID2 == "null" ? "" : ID2, ID3 == "null" ? "" : ID3, out oErrMessage)) { if (oErrMessage == "" || oErrMessage == null || oErrMessage == "null") return true; else return false; } //通过序列号获取最近操作的工单号 string ms_id = getFieldDataByCondition("makeserial", "max(ms_id)", "ms_sncode='" + iSN + "' or ms_firstsn='" + iSN + "'").ToString(); if (ms_id != "") { dt = getFieldsDataByCondition("MakeSerial", new string[] { "ms_id", "ms_mac", "ms_bt", "ms_meid", "ms_netcode", "ms_psn", "ms_imei1", "ms_imei2", "ms_imei3", "ms_othcode1", "ms_othcode2", "ms_othcode3", "ms_othid1", "ms_othid2", "ms_othid3" }, "ms_id='" + ms_id + "'"); if (dt.Rows.Count > 0) { string Code1 = ""; string Code2 = ""; string Code3 = ""; string Code4 = ""; string Code5 = ""; string Code6 = ""; string Code7 = ""; string Code8 = ""; string Code9 = ""; string Code10 = ""; string Code11 = ""; string Code12 = ""; string Code13 = ""; string Code14 = ""; string Code15 = ""; string Code16 = ""; string Code17 = ""; string Code18 = ""; string Code19 = ""; string Code20 = ""; string Code21 = ""; string Code22 = ""; string Code23 = ""; string Code24 = ""; string Code25 = ""; string[] param = new string[] { ms_id, Code1, Code2, Code3, Code4, Code5, Code6, Code7, Code8, Code9, Code10, Code11, Code12, Code13, Code14, Code15, Code16, Code17, Code18, Code19, Code20, Code21, Code22, Code23, Code24, Code25 }; string[] ParamName = new string[] { "v_ms_id", "v_i_code1", "v_i_code2", "v_i_code3", "v_i_code4", "v_i_code5", "v_i_code6", "v_i_code7", "v_i_code8", "v_i_code9", "v_i_code10", "v_i_code11", "v_i_code12", "v_i_code13", "v_i_code14", "v_i_code15", "v_i_code16", "v_i_code17", "v_i_code18", "v_i_code19", "v_i_code20", "v_i_code21", "v_i_code22", "v_i_code23", "v_i_code24", "v_i_code25" }; CallProcedure("GetMobileAllInfo_NEW_TOOL", ParamName, ref param); for (int i = 1; i < param.Length; i++) { //获取出来的参数使用^分割 if (param[i] != "" && param[i] != "null" && param[i] != null) { oInfo.Add(param[i].Split('^')[0], param[i].Split('^')[1]); } } oJson = jss.Serialize(oInfo); oErrMessage = ""; return true; } else { oErrMessage = "序列号" + iSN + "不存在"; return false; } } else { oErrMessage = "序列号" + iSN + "不存在"; return false; } } /// /// 记录操作日志 /// /// /// /// /// /// private void InsertMakeProcess(string iSnCode, string iMakeCode, string iSourceCode, string iMPKind, string result, string iUserCode) { string CurrentStep = ""; string LineCode = ""; string CurrentStepName = ""; GetStepCodeAndNameAndLineBySource(iSourceCode, ref CurrentStep, ref CurrentStepName, ref LineCode); sql.Length = 0; sql.Append("insert into MakeProcess(mp_id,mp_makecode,mp_maid, mp_mscode,mp_sncode,mp_stepcode,mp_stepname,"); sql.Append("mp_craftcode,mp_craftname,mp_kind,mp_result,mp_indate,mp_inman,mp_wccode,mp_linecode,mp_sourcecode,mp_snstatus,mp_sncheckno,mp_snoutboxcode)"); sql.Append("select MakeProcess_seq.nextval, ma_code,ma_id,ms_code,ms_sncode,'" + CurrentStep + "','" + CurrentStepName + "',"); sql.Append("ma_craftcode,ma_craftname,'" + iMPKind + "','" + result + "',sysdate,'" + iUserCode + "',ma_wccode,'" + LineCode + "','" + iSourceCode + "',"); sql.Append("ms_status,ms_checkno,ms_outboxcode from make left join makeserial on ms_makecode=ma_code left join step on st_code=ms_stepcode "); sql.Append("where ms_sncode='" + iSnCode + "' and ma_code='" + iMakeCode + "' and st_code='" + CurrentStep + "'"); ExecuteSql(sql.ToString(), "insert"); } /// /// 保存Mac地址和BT地址 /// /// /// /// /// /// /// /// /// [Description("写入SN的Wifi,BT信息")] public bool SetAddressInfo(string iSN, string iMac, string iBT, string iCode1, string iCode2, string iCode3, out string oErrMessage) { if (iSN == "") { oErrMessage = "SN不能为空"; return false; } oErrMessage = ""; string[] param = new string[] { iSN, iMac, iBT, iCode1, iCode2, iCode3, oErrMessage }; string[] ParamName = new string[] { "v_i_sncode", "v_i_mac", "v_i_bt", "v_i_code1", "v_i_code2", "v_i_code3", "v_o_errmsg" }; CallProcedure("CS_SETADDRESSINFO", ParamName, ref param); oErrMessage = param[6]; if (oErrMessage == "" || oErrMessage == null || oErrMessage == "null") return true; else return false; } [Description("序列号跳到下一 步")] private bool SetStepFinish(string iMakeCode, string iSourceCode, string iSN, string iMPKind, string iResult, string iUserCode, string iErrCode, out string oErrMessage) { if (iSN == "") { oErrMessage = "SN不能为空"; return false; } oErrMessage = ""; string StepCode = getFieldDataByCondition("Makeserial", "ms_stepcode", "ms_sncode='" + iSN + "' and ms_makecode='" + iMakeCode + "'").ToString(); string CurrentStep = GetStepCodeBySource(iSourceCode); string BgCode = getFieldDataByCondition("step", "st_badgroupcode", "st_code='" + CurrentStep + "'").ToString(); switch (iResult) { case "OK": break; case "NG": if (iErrCode == "") { oErrMessage = "测试结果为NG时必须传递不良代码"; return false; } else { UpdateByCondition("makebad", "mb_status=-1", "mb_sncode='" + iSN + "' and mb_makecode='" + iMakeCode + "' and mb_stepcode='" + CurrentStep + "' and mb_status=0"); string[] BadCode = iErrCode.Split(','); sql.Length = 0; sql.Append("insert into makebad(mb_id,mb_makecode,mb_mscode,mb_sncode,mb_inman,mb_indate,mb_stepcode"); sql.Append(",mb_sourcecode,mb_badcode,mb_badtable,mb_bgcode,mb_soncode,mb_status) select makebad_seq.nextval"); sql.Append(",ma_code,ms_code,ms_sncode,'" + iUserCode + "',sysdate,'" + CurrentStep + "','" + iSourceCode + "',:bc_code,'',"); sql.Append("'" + BgCode + "',sp_soncode,'0' from make left join makeSerial on ms_makecode=ma_code left join stepProduct on "); sql.Append("sp_mothercode=ma_prodcode and sp_stepcode=ms_nextstepcode where ms_sncode='" + iSN + "' and ms_makecode='" + iMakeCode + "'"); List InsertSQL = new List(); for (int i = 0; i < BadCode.Length; i++) { InsertSQL.Add(sql.ToString().Replace(":bc_code", "'" + BadCode[i] + "'")); } ExecuteSQLTran(InsertSQL.ToArray()); //将不良的序列号的状态码设为3 ExecuteSql("update makeserial set ms_status='3' where ms_sncode='" + iSN + "' and ms_makecode='" + iMakeCode + "'", "update"); } break; default: oErrMessage = "测试结果必须为NG或者OK"; return false; } //不良采集为良品是更新 if (StepCode == CurrentStep && iResult == "OK") { DataTable dt = getFieldsDataByCondition("makeserial", new string[] { "ms_status", "ms_craftcode", "ms_prodcode" }, "ms_sncode='" + iSN + "' and ms_makecode='" + iMakeCode + "'"); if (dt.Rows.Count > 0) { string ms_status = dt.Rows[0]["ms_status"].ToString(); string ms_craftcode = dt.Rows[0]["ms_craftcode"].ToString(); string ms_prodcode = dt.Rows[0]["ms_prodcode"].ToString(); if (ms_status == "3") { string nextstepcode = getFieldDataByCondition("craft left join craftdetail on cr_id=cd_crid ", "cd_nextstepcode", "cr_code='" + ms_craftcode + "' and cr_prodcode='" + ms_prodcode + "' and cd_stepcode='" + CurrentStep + "'").ToString(); UpdateByCondition("makeserial", "ms_status=1,ms_nextstepcode='" + nextstepcode + "'", "ms_sncode='" + iSN + "' and ms_makecode='" + iMakeCode + "'"); UpdateByCondition("makebad", "mb_status=-1", "mb_sncode='" + iSN + "' and mb_makecode='" + iMakeCode + "'"); } } } return CS_SetFinish(iMakeCode, iSourceCode, iSN, iUserCode, iResult, out oErrMessage); } /// /// 设置测试结果 /// /// /// /// /// /// /// /// /// [Description("设置测试结果,结果必须为NG或者OK")] public bool SetMobileData(string iTSN, string iSN, string iSourceCode, string iOperater, string iResult, string iErrCode, string flag, out string oErrorMessage) { oErrorMessage = ""; if (iTSN == "") { oErrorMessage = "TSN不能为空"; return false; } if (iSN == "") { oErrorMessage = "SN不能为空"; return false; } DataTable dt = (DataTable)ExecuteSql("select ms_sncode from makeserial where ms_imei1='" + iTSN + "' order by ms_id desc", "select"); if (dt.Rows.Count > 0) { iTSN = dt.Rows[0]["ms_sncode"].ToString(); } else { dt = (DataTable)ExecuteSql("select ms_sncode from makeserial where ms_imei2='" + iTSN + "' order by ms_id desc", "select"); if (dt.Rows.Count > 0) { iTSN = dt.Rows[0]["ms_sncode"].ToString(); } } string[] param = new string[] { iTSN, iSN, iSourceCode, iOperater, iResult, iErrCode, oErrorMessage }; string[] ParamName = new string[] { "v_i_tsn", "v_i_sncode", "v_i_sourcecode", "v_i_usercode", "v_i_result", "v_i_errcode", "v_o_errmsg" }; CallProcedure("CS_DLLSNCHANGE_TOOL", ParamName, ref param); oErrorMessage = param[6]; if (oErrorMessage == "" || oErrorMessage == null || oErrorMessage == "null") return true; else return false; } private bool CS_SetFinish(string iMakeCode, string iSourceCode, string iSN, string iUserCode, string iResult, out string oErrMessage) { if (iSN == "") { oErrMessage = "SN不能为空"; return false; } oErrMessage = ""; string[] param = new string[] { iMakeCode, iSourceCode, iSN, iUserCode, iResult, oErrMessage }; string[] ParamName = new string[] { "v_i_macode", "v_i_sourcecode", "v_i_sncode", "v_i_usercode", "v_i_result", "v_o_errmsg" }; CallProcedure("CS_SETSTEPRESULT_TOOL", ParamName, ref param); oErrMessage = param[5]; if (oErrMessage == "" || oErrMessage == null || oErrMessage == "null") return true; else return false; } /// /// 方法说明:测试详细信息录入系统,针对一个SN多个测试项目结果可循环调用 /// /// 序列号 /// /// /// /// /// /// /// /// /// /// /// /// /// [Description("设置测试结果")] public bool SetTestDetail(string iSN, string iClass, string iResCode, string[,] iTestDetail, out string oErrMessage) { if (iSN == "" || iSN == null) { oErrMessage = "SN不能为空"; return false; } oErrMessage = ""; string omakeCode = ""; GetRcardMOInfo(iSN, out omakeCode, out oErrMessage); sql.Clear(); sql.Append("begin "); bool needBreak = false; for (int i = 0; i < iTestDetail.Length / 200; i++) { string DataField = "Insert into MES_TEST(STD_ID,STD_SN,STD_MAKECODE,STD_CLASS,STD_TESTDATE,"; string ValueField = ")values(MES_TEST_SEQ.nextval,'" + iSN + "','" + omakeCode + "','" + iClass + "',sysdate,"; for (int j = 0; j < 200; j++) { if (j == 0) { DataField += "STD_ITEMNAME,"; //如果传递的参数没有测试名称则中断插入 if (iTestDetail[i, j] == "" || iTestDetail[i, j] == null) { //外层循环也需要中断 needBreak = true; break; } } else { DataField += "STD_ITEM" + j + " ,"; } ValueField += "'" + iTestDetail[i, j] + "',"; } if (needBreak) break; sql.Append(DataField.Substring(0, DataField.Length - 1) + ValueField.Substring(0, ValueField.Length - 1) + ");"); } sql.Append("end;"); ExecuteSql(sql.ToString(), "insert"); return true; } /// /// 作业调用该方法将确认接收SN对应的IMEI及附属信息。 /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// [Description("设置IMEI信息")] public bool SetIMEIInfo(string iSN, string iIMEI1, string iIMEI2, string iIMEI3, string iMEID, string iPSN, string iNETCODE, string iID1, string iID2, string iID3, out string oErrMessage) { if (iSN == "") { oErrMessage = "SN不能为空"; return false; } oErrMessage = ""; string[] param = new string[] { iSN, iIMEI1, iIMEI2, iIMEI3, iMEID, iNETCODE, iPSN, iID1, iID2, iID3, oErrMessage }; string[] ParamName = new string[] { "v_i_sncode", "v_i_imei1", "v_i_imei2", "v_i_imei3", "v_i_meid", "v_i_netcode", "v_i_psn", "v_i_id1", "v_i_id2", "v_i_id3", "v_o_errmsg" }; CallProcedure("CS_SETIMEIINFO", ParamName, ref param); oErrMessage = param[10]; if (oErrMessage == "" || oErrMessage == null || oErrMessage == "null") return true; else return false; } /// /// /// /// /// /// /// /// /// /// [Description("设置测试结果")] public bool SetPcbaData(string iSN, string iResCode, string iOperator, string iResult, string iErrCode, out string oErrMessage) { if (iSN == "") { oErrMessage = "SN不能为空"; return false; } string SNcode = iSN; //if (!GetInfoByMaterial(iSN, out iSN, out oErrMessage)) //{ // oErrMessage = ""; //} if (iSN == "") { iSN = SNcode; } oErrMessage = ""; string oMakeCode = ""; GetRcardMOInfo(iSN, out oMakeCode, out oErrMessage); if (oErrMessage == "" || oErrMessage == null || oErrMessage == "null") return SetStepFinish(oMakeCode, iResCode, iSN, "", iResult, iOperator, iErrCode, out oErrMessage); else return false; } /// /// 序列号归属工单 /// /// /// /// /// /// [Description("序列号归属工单")] public bool GoMo(string iMO, string iSN, string iResCode, out string oErrMessage) { if (iSN == "") { oErrMessage = "SN不能为空"; return false; } oErrMessage = ""; string[] param = new string[] { iMO, iResCode, iSN, "", "", "", oErrMessage }; string[] ParamName = new string[] { "v_i_macode", "v_i_sourcecode", "v_i_sncode", "v_i_usercode", "v_o_macode", "v_o_msid", "v_o_errmsg" }; CallProcedure("CS_CHECKSTEPSNANDMACODE", ParamName, ref param); oErrMessage = param[6]; DataTable dt = (DataTable)ExecuteSql("select ms_status,ms_stepcode,ms_nextstepcode from makeserial where ms_id=(select max(ms_id) from makeserial where ms_sncode='" + iSN + "')", "select"); string ms_status = ""; string ms_stepcode = ""; string ms_nextstepcode = ""; if (dt.Rows.Count > 0) { ms_status = dt.Rows[0]["ms_status"].ToString(); ms_stepcode = dt.Rows[0]["ms_stepcode"].ToString(); ms_nextstepcode = dt.Rows[0]["ms_nextstepcode"].ToString(); } string stepcode = GetStepCodeBySource(iResCode); if (oErrMessage == "" || oErrMessage == null || oErrMessage == "null" || (ms_status == "3" && ms_stepcode == stepcode)) { if (ms_status == "3") { oErrMessage = ""; } return true; } else return false; } /// /// 获取执行步骤代码,名称和线别 /// /// /// /// /// private void GetStepCodeAndNameAndLineBySource(string Source, ref string StepCode, ref string StepName, ref string LineCode) { DataTable dt = getFieldsDataByCondition("source", new string[] { "sc_stepcode", "sc_stepname", "sc_linecode" }, "sc_code='" + Source + "'"); if (dt.Rows.Count > 0) { StepCode = dt.Rows[0]["sc_stepcode"].ToString(); StepName = dt.Rows[0]["sc_stepname"].ToString(); LineCode = dt.Rows[0]["sc_linecode"].ToString(); } } /// /// 获取步骤代码和名称 /// /// /// /// private void GetStepCodeAndNameBySource(string Source, ref string StepCode, ref string StepName) { DataTable dt = getFieldsDataByCondition("source", new string[] { "sc_stepcode", "sc_stepname", "sc_linecode" }, "sc_code='" + Source + "'"); if (dt.Rows.Count > 0) { StepCode = dt.Rows[0]["sc_stepcode"].ToString(); StepName = dt.Rows[0]["sc_stepname"].ToString(); } } /// /// 获取步骤代码 /// /// /// private string GetStepCodeBySource(string Source) { return getFieldDataByCondition("source", "sc_stepcode", "sc_code='" + Source + "'").ToString(); } /// /// 获取步骤代码 /// /// /// private string GetStepName(string st_code) { return getFieldDataByCondition("step", "st_name", "st_code='" + st_code + "'").ToString(); } /// /// 获取第一行第一列的信息 /// private object getFieldDataByCondition(string TableName, string Field, string Condition) { DataTable dt = new DataTable(); string sql = "select " + Field + " from " + TableName + " where " + Condition; command = new OracleCommand(sql, connection); Reconnect(command); OracleDataAdapter ad = new OracleDataAdapter(); ad.SelectCommand = command; try { ad.Fill(dt); } catch (Exception) { connection = new OracleConnection(ConnectionStrings); connection.Open(); command = new OracleCommand(sql, connection); ad = new OracleDataAdapter(); ad.SelectCommand = command; ad.Fill(dt); } ad.Dispose(); command.Dispose(); if (dt.Rows.Count > 0) { return dt.Rows[0][0]; } else { return ""; } } /// /// 通过表名和获取单行的记录 /// private DataTable getFieldsDataByCondition(string TableName, string[] Fields, string Condition) { DataTable dt = new DataTable(); string sql = "select "; sql += AddField(Fields); sql += " from " + TableName + " where " + Condition + " and rownum=1"; command = new OracleCommand(sql, connection); Reconnect(command); OracleDataAdapter ad = new OracleDataAdapter(command); try { ad.Fill(dt); } catch (Exception) { connection = new OracleConnection(ConnectionStrings); connection.Open(); command = new OracleCommand(sql, connection); ad = new OracleDataAdapter(); ad.SelectCommand = command; ad.Fill(dt); } ad.Dispose(); command.Dispose(); return dt; } /// /// 通过表名,字段和条件获取DataTable类型的数据 /// private DataTable getFieldsDatasByCondition(string TableName, string[] Fields, string Condition) { DataTable dt = new DataTable(); string sql = "select "; sql += AddField(Fields); sql += " from " + TableName + " where " + Condition; command = new OracleCommand(sql, connection); Reconnect(command); OracleDataAdapter ad = new OracleDataAdapter(command); try { ad.Fill(dt); } catch (Exception) { connection = new OracleConnection(ConnectionStrings); connection.Open(); command = new OracleCommand(sql, connection); ad = new OracleDataAdapter(); ad.SelectCommand = command; ad.Fill(dt); } ad.Dispose(); command.Dispose(); return dt; } /// /// 通过表名,字段获取DataTable类型的数据 /// private DataTable getFieldsDatas(string TableName, string Fields) { DataTable dt = new DataTable(); string sql = "select "; sql += Fields; sql += " from " + TableName; command = new OracleCommand(sql, connection); Reconnect(command); OracleDataAdapter ad = new OracleDataAdapter(command); ad.SelectCommand = command; try { ad.Fill(dt); } catch (Exception) { connection = new OracleConnection(ConnectionStrings); connection.Open(); command = new OracleCommand(sql, connection); ad = new OracleDataAdapter(); ad.SelectCommand = command; ad.Fill(dt); } ad.Dispose(); command.Dispose(); return dt; } /// /// 检测内容是否存在 /// /// /// /// private bool CheckExist(string TableName, string Condition) { string sql = "select count(1) from " + TableName + " where " + Condition; command = new OracleCommand(sql, connection); Reconnect(command); OracleDataAdapter ad = new OracleDataAdapter(command); DataTable dt = new DataTable(); ad.Fill(dt); ad.Dispose(); command.Dispose(); return int.Parse(dt.Rows[0][0].ToString()) > 0; } /// /// 直接执行SQL,同时传入SQL的类型 /// /// /// /// private object ExecuteSql(string SQL, string Type, params object[] names) { object result = null; command = new OracleCommand(SQL, connection); Reconnect(command); //用来拼接参数的 if (names.Length > 0) { string[] par = SQL.Split(':'); //用来存参数的数组 StringBuilder[] addpar = new StringBuilder[par.Length - 1]; for (int i = 0; i < par.Length - 1; i++) { //新建一个char类型的数组用来存储每个字节的变量 char[] c = par[i + 1].ToCharArray(); addpar[i] = new StringBuilder(); for (int j = 0; j < c.Length; j++) { if (c[j] != ' ' && c[j] != ',' && c[j] != ')') { addpar[i].Append(c[j]); } else { break; } } } for (int i = 0; i < addpar.Length; i++) { command.Parameters.Add(new OracleParameter(addpar[i].ToString(), names[i])); } } switch (Type.ToUpper()) { case "SELECT": OracleDataAdapter ad = new OracleDataAdapter(command); result = new DataTable(); try { ad.Fill((DataTable)result); } catch (Exception) { connection = new OracleConnection(ConnectionStrings); connection.Open(); command = new OracleCommand(SQL, connection); ad = new OracleDataAdapter(); ad.SelectCommand = command; ad.Fill((DataTable)result); } break; case "DELETE": try { result = command.ExecuteNonQuery(); } catch (Exception) { command.Connection = new OracleConnection(ConnectionStrings); command.Connection.Open(); result = command.ExecuteNonQuery(); } break; case "UPDATE": try { result = command.ExecuteNonQuery(); } catch (Exception) { command.Connection = new OracleConnection(ConnectionStrings); command.Connection.Open(); result = command.ExecuteNonQuery(); } break; case "INSERT": try { result = command.ExecuteNonQuery(); } catch (Exception) { command.Connection = new OracleConnection(ConnectionStrings); command.Connection.Open(); result = command.ExecuteNonQuery(); } break; } command.Dispose(); return result; } /// /// 出现异常进行回滚的执行方法 /// /// private void ExecuteSQLTran(params string[] SQL) { command = new OracleCommand(); command.Connection = new OracleConnection(ConnectionStrings); command.Connection.Open(); Reconnect(command); OracleTransaction tx = command.Connection.BeginTransaction(IsolationLevel.ReadCommitted); command.Transaction = tx; try { foreach (string sql in SQL) { if (!string.IsNullOrEmpty(sql)) { command.CommandText = sql; command.ExecuteNonQuery(); } } tx.Commit(); } catch (OracleException E) { tx.Rollback(); throw new Exception(E.Message); } command.Dispose(); } private string UpdateByCondition(string TableName, string update, string condition) { string sql = "update " + TableName + " set " + update + " where " + condition; command = new OracleCommand(sql, connection); Reconnect(command); try { command.ExecuteNonQuery(); } catch (Exception) { command.Connection = new OracleConnection(ConnectionStrings); command.Connection.Open(); command.ExecuteNonQuery(); } command.Dispose(); return sql; } private void CallProcedure(string ProcedureName, string[] ParamName, ref string[] param) { command = new OracleCommand(ProcedureName); command.Connection = connection; Reconnect(command); command.CommandText = ProcedureName; command.CommandType = CommandType.StoredProcedure; for (int i = 0; i < param.Length; i++) { command.Parameters.Add(new OracleParameter(ParamName[i], OracleDbType.Varchar2, 200, param[i], ParameterDirection.InputOutput)); //command.Parameters.Add(new OracleParameter(ParamName[i], OracleType.VarChar, 200, ParameterDirection.InputOutput, "", DataRowVersion.Default, true, param[i])); } try { command.ExecuteNonQuery(); } catch (Exception) { command.Connection = new OracleConnection(ConnectionStrings); command.Connection.Open(); command.ExecuteNonQuery(); } for (int i = 0; i < command.Parameters.Count; i++) param[i] = command.Parameters[i].Value.ToString(); command.Dispose(); } private string AddField(string[] Fields) { string sql = " "; foreach (string field in Fields) { sql += field + ","; } return sql.Substring(0, sql.Length - 1); } private string[] GetField(string field) { string[] fields = field.Split(','); for (int i = 0; i < fields.Length; i++) { fields[i] = fields[i].Substring(fields[i].LastIndexOf("as") + 2, fields[i].Length - fields[i].LastIndexOf("as") - 2).Trim(); } return fields; } private void Reconnect(OracleCommand cmd) { if (cmd.Connection.State == ConnectionState.Closed) { cmd.Connection.Open(); } } /// /// 验证用户身份信息 /// /// /// /// private bool CheckUserLogin(string iUserCode, string iPassWord, string Master, out string oErrorMessage) { oErrorMessage = ""; try { string url = "http://10.98.0.21:8099/mes/mobile/login.action";//html调用的地址 HttpWebRequest webrequest = (HttpWebRequest)WebRequest.Create(url); if (webrequest == null) { return false; } webrequest.Method = "POST"; webrequest.Timeout = 1000; webrequest.ContentType = "application/x-www-form-urlencoded"; System.Collections.Hashtable pars = new System.Collections.Hashtable(); pars.Add("username", iUserCode); pars.Add("password", iPassWord); pars.Add("master", Master); string buffer = ""; //发送POST数据 if (!(pars == null || pars.Count == 0)) { foreach (string key in pars.Keys) { buffer = buffer + "&" + key + "=" + pars[key].ToString(); } byte[] data = Encoding.UTF8.GetBytes(buffer); using (Stream stream = webrequest.GetRequestStream()) { stream.Write(data, 0, data.Length); } } string[] values = webrequest.Headers.GetValues("Content-Type"); WebResponse myResponse = webrequest.GetResponse(); using (Stream resStream = myResponse.GetResponseStream())//得到回写的流 { StreamReader newReader = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8); string Content = newReader.ReadToEnd(); Dictionary dic = new Dictionary(); dic = ToDictionary(Content); if (!dic.ContainsKey("erpaccount")) { oErrorMessage = dic["reason"].ToString(); return false; } newReader.Close(); } } catch (Exception ex) { oErrorMessage = ex.Message.ToString(); return false; } return true; } private Dictionary ToDictionary(string JsonData) { object Data = null; Dictionary Dic = new Dictionary(); if (JsonData.StartsWith("[")) { //如果目标直接就为数组类型,则将会直接输出一个Key为List的List>集合 //使用示例List> ListDic = (List>)Dic["List"]; List> List = new List>(); MatchCollection ListMatch = Regex.Matches(JsonData, @"{[\s\S]+?}");//使用正则表达式匹配出JSON数组 foreach (Match ListItem in ListMatch) { List.Add(ToDictionary(ListItem.ToString()));//递归调用 } Data = List; Dic.Add("List", Data); } else { MatchCollection Match = Regex.Matches(JsonData, @"""(.+?)"": {0,1}(\[[\s\S]+?\]|null|"".+?""|-{0,1}\d*)");//使用正则表达式匹配出JSON数据中的键与值 foreach (Match item in Match) { try { if (item.Groups[2].ToString().StartsWith("[")) { //如果目标是数组,将会输出一个Key为当前Json的List>集合 //使用示例List> ListDic = (List>)Dic["Json中的Key"]; List> List = new List>(); MatchCollection ListMatch = Regex.Matches(item.Groups[2].ToString(), @"{[\s\S]+?}");//使用正则表达式匹配出JSON数组 foreach (Match ListItem in ListMatch) { List.Add(ToDictionary(ListItem.ToString()));//递归调用 } Data = List; } else if (item.Groups[2].ToString().ToLower() == "null") Data = null;//如果数据为null(字符串类型),直接转换成null else Data = item.Groups[2].ToString(); //数据为数字、字符串中的一类,直接写入 Dic.Add(item.Groups[1].ToString(), Data); } catch { } } } return Dic; } } }