using Oracle.ManagedDataAccess.Client; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Runtime.InteropServices; using System.Text; 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 iSnCode, string iIMEI1, 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); } [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(); //系统默认的的连接字符串 private string ConnectionStrings = "Connection Timeout=0;Pooling=false;Password=select!#%*(;User ID=N_MES_T;Pooling=false;Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=218.64.89.153)(PORT=61521)))(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=MES;PassWord=select!#%*(;"); } /// /// 检测当前的岗位资源对应的工序 /// /// /// /// /// [Description("序列号对应工序检测")] public bool CheckRoutePassed(string iSN, string iResCode, out string oErrMessage) { if (iSN == "") { oErrMessage = "SN不能为空"; return false; } 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]; 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 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 = "当前序列号下一工序" + 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() + "^"; oInfo += "BT:" + param[3].ToString() + "^"; oInfo += "Code1:" + param[4].ToString() + "^"; oInfo += "Code2:" + param[5].ToString() + "^"; 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() + "^"; oInfo += "IMEI2:" + param[5].ToString() + "^"; oInfo += "MEID:" + param[7].ToString() + "^"; oInfo += "NETCODE:" + param[8].ToString() + "^"; oInfo += "PSN:" + param[9].ToString() + ""; oInfo += "ID1:" + param[10].ToString() + ""; oInfo += "ID2:" + param[11].ToString() + ""; oInfo += "ID3:" + param[12].ToString() + ""; 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; } 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 ms_id = getFieldDataByCondition("makeserial", "max(ms_id)", "ms_sncode='" + iSN + "' or ms_firstsn='" + iSN + "'").ToString(); if (ms_id != "") { DataTable 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", 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; } 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, out string oErrMessage) { if (iSN == "") { oErrMessage = "SN不能为空"; return false; } oErrMessage = ""; string[] param = new string[] { iSN, iIMEI1, "", "", "", "", "", "", "", "", 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; } 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(); } } } }