=datEndTime.
// L計算起迄 : S---------------------------------------------------------------------E
// L6 Wait_1st : |-------------------------------------------------------------------------------------------------------|
strSQL = "Select CreateDate,ReleaseDate,WaitNo From tblWIPWaitBasis " + " Where LotNo='" + strFromLotNo + "'" + " And CreateDate<=To_Date('" + Strings.Format(Conversions.ToDate(datStartTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') " + " And (ReleaseDate>=To_Date('" + Strings.Format(Conversions.ToDate(datEndTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') or ReleaseDate is null) " + " Order by ReleaseDate";
SQLCommandTuning(strDataBaseType, ref strSQL);
//cmmTemp = new IDbCommand(strSQL, cnnTemp);
drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp);
while (drTemp.Read())
{
// 切割點
// -CreateDate在外面,不需加入.
// -ReleaseDate在外面,不需加入.
// 排除時間段
drAdd = dtHoldWait.NewRow();
drAdd["LotNo"] = strLotNo;
drAdd["LogGroupSerial"] = strLogGroupSerial;
drAdd["StartTime"] = Strings.Format(Conversions.ToDate(datStartTime), "yyyy/MM/dd H:mm:ss");
drAdd["EndTime"] = Strings.Format(Conversions.ToDate(datEndTime), "yyyy/MM/dd H:mm:ss");
drAdd["DType"] = "W";
drAdd["DTypeNo"] = drTemp["WaitNo"];
dtHoldWait.Rows.Add(drAdd);
}
drTemp.Close();
//cmmTemp.Dispose();
}
}
catch
{
throw;
}
finally
{
}
return default(string);
}
private int funWriteShareEMPLog(string WriteTxt)
{
int funWriteShareEMPLogRet = default(int);
funWriteShareEMPLogRet = -1;
try
{
if (!Directory.Exists(AppDomain.CurrentDomain.BaseDirectory + @"\Log"))
{
Directory.CreateDirectory(AppDomain.CurrentDomain.BaseDirectory + @"\Log");
}
var fs = new FileStream(AppDomain.CurrentDomain.BaseDirectory + @"\Log\AutoRun_ShareEMPTime_Log_" + Strings.Format(DateTime.Now, "yyyyMMdd") + ".txt", FileMode.OpenOrCreate, FileAccess.ReadWrite);
var w = new StreamWriter(fs);
w.BaseStream.Seek(0L, SeekOrigin.End);
w.WriteLine(Strings.Format(DateTime.Now, "yyyy/MM/dd HH:mm:ss") + " " + WriteTxt);
w.Close();
fs.Close();
funWriteShareEMPLogRet = 0;
}
catch (Exception e1)
{
}
return funWriteShareEMPLogRet;
}
#endregion
#region ---設備保養工單自動開立---
private string funPMWOAutoCreate_EQPTypeSOP(Collection colParameters = null)
{
string funPMWOAutoCreate_EQPTypeSOPRet = default(string);
var cnnTemp = default(IDbConnection);
//var daTemp = default(System.Data.OleDb.OleDbDataAdapter);
var colSQL = new Collection();
var colSQL_Rows = new Collection();
var dsTemp = new DataSet();
var dsChamber = new DataSet();
DataRow[] drSel;
string strSQL;
string strWONo;
DateTime datEventTime;
int intWOItemNo = 0;
bool blnAutoCreateWO, blnLockEquipment, blnAutoEmail, blnCreateAndReleaseWO, blnChkEQPState;
DataRow drAdd;
var dtSendMail = BuildMailTable();
string strSendMailMSG;
string EquipmentNoList = "";
string strEQPSerialNo;
int intWOType = 0; // 預防保養工單
string strFailMsg = "";
string ChamberManage = defString;
DbDataReader drTemp;
try
{
datEventTime = DateTime.Now;
cnnTemp = CreateConnection(strConnectionString);
//// 取出已到期的保養計劃(預估保養日PMEstDateTime <= Now)
//strSQL = " Select A.*,B.EquipmentNo,B.PMSerialNo,B.PMEstDateTime,B.SerialNo,C.EquipmentName,C.EngineerGroupNo,D.PMSOPName As PMSOPName_Basis" +
// " From tblPMEQPTypeSOPBasis A Join tblPMEQPMaintenancePlan B On A.PMEQPSOPNo = B.PMEQPSOPNo" + " Join tblEQPEquipmentBasis C On B.EquipmentNo = C.EquipmentNo " +
// " Left Join tblPMSOPBasis D On A.PMSOPNo = D.PMSOPNo" + " Where B.PMEstDateTime <= To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd") + "','YYYY/MM/DD') ";
//strSQL = SQLCommandTuning(strDataBaseType, ref strSQL);
////cmmTemp = new IDbCommand(strSQL, cnnTemp);
////daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp);
////daTemp.Fill(dsTemp, "PMEQPMaintenancePlan");
////daTemp.Dispose();
//ExecuteSQLQuery_Adapter(strSQL, dsTemp, "PMEQPMaintenancePlan", cnnTemp);
//取出已到期的保養計劃(預估保養日PMEstDateTime-BeforehandDay <= Now), 若未設提前開單天數(BeforehandDay, 則BeforehandDay會是0)
strSQL = " Select A.*,B.EquipmentNo,B.PMSerialNo,B.PMEstDateTime,B.SerialNo,C.EquipmentName,C.EngineerGroupNo,D.PMSOPName As PMSOPName_Basis" +
" From tblPMEQPTypeSOPBasis A Join tblPMEQPMaintenancePlan B On A.PMEQPSOPNo = B.PMEQPSOPNo" + " Join tblEQPEquipmentBasis C On B.EquipmentNo = C.EquipmentNo " +
" Left Join tblPMSOPBasis D On A.PMSOPNo = D.PMSOPNo" + " Where (B.PMEstDateTime-Nvl(A.Beforehandday,0)) <= To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd") + "','YYYY/MM/DD') ";
strSQL = SQLCommandTuning(strDataBaseType, ref strSQL);
//cmmTemp = new IDbCommand(strSQL, cnnTemp);
//daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp);
//daTemp.Fill(dsTemp, "PMEQPMaintenancePlan");
//daTemp.Dispose();
ExecuteSQLQuery_Adapter(strSQL, dsTemp, "PMEQPMaintenancePlan", cnnTemp);
// 取出設備狀態互斥設定
//cmmTemp.CommandText = "Select * From tblEMSViolateStatusChange";
//daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp);
//daTemp.Fill(dsTemp, "ViolateStatusChange");
//daTemp.Dispose();
strSQL = "Select * From tblEMSViolateStatusChange";
ExecuteSQLQuery_Adapter(strSQL, dsTemp, "ViolateStatusChange", cnnTemp);
// 組出應保養的設備List
foreach (DataRow row in dsTemp.Tables["PMEQPMaintenancePlan"].DefaultView.ToTable(true, "EquipmentNo").Rows)
EquipmentNoList = Conversions.ToString(EquipmentNoList + row["EquipmentNo"] + ",");
EquipmentNoList = EquipmentNoList.TrimEnd(',');
// 取出各設備的EMSEquipmentState
//cmmTemp.CommandText = "Select * From tblEMSEquipmentState Where EquipmentNo In ('" + Strings.Replace(EquipmentNoList, ",", "','") + "')";
//daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp);
//daTemp.Fill(dsTemp, "EMSEquipmentState");
//daTemp.Dispose();
strSQL = "Select * From tblEMSEquipmentState Where EquipmentNo In ('" + Strings.Replace(EquipmentNoList, ",", "','") + "')";
ExecuteSQLQuery_Adapter(strSQL, dsTemp, "EMSEquipmentState", cnnTemp);
// 2021/10/14 Mantis:0100751 當啟用系統參數:子設備管理,改變設備狀態時,需一併更新設備底下子設備的狀態
strSQL = "Select PARAMETERVALUE from tblSYSParameter where PARAMETERNO = 'ChamberManage'";
//cmmTemp = new IDbCommand(strSQL, cnnTemp);
drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp);
if (drTemp.Read())
{
ChamberManage = drTemp["PARAMETERVALUE"].ToString();
}
drTemp.Dispose();
// 依每筆設備保養標準作業程序來開立保養工單
foreach (DataRow drEQPSOP in dsTemp.Tables["PMEQPMaintenancePlan"].DefaultView.ToTable(true, new[] { "PMEQPSOPNO", "AutoCreateWO", "CreateAndReleaseWO", "LockEquipment", "AutoEmail" }).Rows)
{
colSQL.Clear();
colSQL_Rows.Clear();
strWONo = "未開工單";
if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drEQPSOP["AutoCreateWO"], 1, false)))
{
blnAutoCreateWO = true;
}
else
{
blnAutoCreateWO = false;
}
if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drEQPSOP["CreateAndReleaseWO"], 1, false)))
{
blnCreateAndReleaseWO = true;
}
else
{
blnCreateAndReleaseWO = false;
}
if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drEQPSOP["LockEquipment"], 1, false))) // 變更機台狀態
{
blnLockEquipment = true;
}
else
{
blnLockEquipment = false;
}
if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drEQPSOP["AutoEmail"], 1, false))) // 是否要發送Mail
{
blnAutoEmail = true;
}
else
{
blnAutoEmail = false;
}
foreach (DataRow drEQP in dsTemp.Tables["PMEQPMaintenancePlan"].Select(Conversions.ToString("PMEQPSOPNO = '" + drEQPSOP["PMEQPSOPNo"] + "'")))
{
if (string.IsNullOrEmpty(drEQP["PMSOPName_Basis"].ToString()))
{
if (!string.IsNullOrEmpty(strFailMsg))
{
strFailMsg = Conversions.ToString(strFailMsg + Constants.vbCrLf + "[PMSOPBasis does not exist, PMSOPNo:" +
drEQP["PMSOPNo"] + "]");
}
else
{
strFailMsg = Conversions.ToString("[PMSOPBasis does not exist, PMSOPNo:" + drEQP["PMSOPNo"] + "]");
}
continue;
}
// 設備狀態變更處理
blnChkEQPState = true; //設備狀態檢核通過預設為通過, 只有要改變設備狀態且設備狀態互斥時才會被改為false
//沒有設提早開單且有要改變設備狀態的, 才做設備狀態變更
if (Conversions.ToInteger(drEQP["BeforehandDay"]) == 0 && blnLockEquipment == true && !string.IsNullOrEmpty(drEQP["EquipmentState"].ToString()))
{
drSel = dsTemp.Tables["EMSEquipmentState"].Select(Conversions.ToString("EquipmentNo = '" + drEQP["EquipmentNo"] + "'"));
if (drSel.Length > 0)
{
// 狀態互斥則開工單但不下線
if (dsTemp.Tables["ViolateStatusChange"].Select(Conversions.ToString("EquipmentState = " +
drSel[0]["EquipmentState"] + " And ViolativeState = " + drEQP["EquipmentState"])).Length > 0)
{
//continue;
blnChkEQPState = false;
}
else
{
if (Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(drSel[0]["EquipmentState"], drEQP["EquipmentState"], false))) // 狀態不同才需改變設備狀態
{
strEQPSerialNo = InitEQPSerialNo();
if (strEQPSerialNo == "fail")
{
funPMWOAutoCreate_EQPTypeSOPRet = "fail;[Get InitEQPSerialNo fail]";
return funPMWOAutoCreate_EQPTypeSOPRet;
}
// Del Same EQPSerialNo
strSQL = Conversions.ToString("Delete tblEMSEquipmentStateLog Where EQPSerialNo = '" + drSel[0]["EQPSerialNo"] + "'");
colSQL.Add(strSQL);
colSQL_Rows.Add(-1);
// Add EMSEquipmentStateLog
strSQL = Conversions.ToString(" Insert into tblEMSEquipmentStateLog (EQPSerialNo,EquipmentNo,EquipmentState,EquipmentType,UserNo,StartTime,EndTime,Description) " + " Select EQPSerialNo,EquipmentNo,EquipmentState,EquipmentType,UserNo,StartTime,To_Date('" + Strings.Format(Conversions.ToDate(datEventTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),Description " + " From tblEMSEquipmentState " + " Where EquipmentNo = '" +
drEQP["EquipmentNo"] + "'");
colSQL.Add(strSQL);
colSQL_Rows.Add(1);
// 更新EMSEquipmentState
strSQL = Conversions.ToString("Update tblEMSEquipmentState Set " + "EquipmentState = " +
drEQP["EquipmentState"] + "," + "StartTime = To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') ," +
"EQPSerialNo = '" + strEQPSerialNo + "'," + "Description ='AutoRun'," + "UserNo = 'AutoRun'" + "Where EquipmentNo = '" +
drEQP["EquipmentNo"] + "'");
colSQL.Add(strSQL);
colSQL_Rows.Add(1);
// 若開啟子設備管理,則須更新設備下子設備的設備狀態
if (ChamberManage == "1")
{
strSQL = "Select EquipmentNo from tblEQPEquipmentBasis Where BELONGEQUIPMENTNO = '" + drEQP["EquipmentNo"].ToString() + "'";
//cmmTemp = new IDbCommand(strSQL, cnnTemp);
//daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp);
dsChamber = new DataSet();
//daTemp.Fill(dsChamber, "ChamberData");
//daTemp.Dispose();
ExecuteSQLQuery_Adapter(strSQL, dsChamber, "ChamberData", cnnTemp);
foreach (DataRow dr in dsChamber.Tables["ChamberData"].Rows)
{
strSQL = "Select * From tblEMSEquipmentState Where EquipmentNo = '" + dr["EquipmentNo"].ToString() + "'";
//cmmTemp = new IDbCommand(strSQL, cnnTemp);
drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp);
if (drTemp.Read())
{
// 設備狀態不同才變更
if (Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(drEQP["EquipmentState"], drTemp["EquipmentState"], false)))
{
strEQPSerialNo = InitEQPSerialNo();
if (strEQPSerialNo == "fail")
{
funPMWOAutoCreate_EQPTypeSOPRet = "fail;[Get InitEQPSerialNo fail]";
return funPMWOAutoCreate_EQPTypeSOPRet;
}
// Del Same EQPSerialNo
strSQL = Conversions.ToString("Delete tblEMSEquipmentStateLog Where EQPSerialNo = '" +
drTemp["EQPSerialNo"] + "'");
colSQL.Add(strSQL);
colSQL_Rows.Add(-1);
// Add EMSEquipmentStateLog
strSQL = Conversions.ToString(" Insert into tblEMSEquipmentStateLog (EQPSerialNo,EquipmentNo,EquipmentState,EquipmentType,UserNo,StartTime,EndTime,Description) " + " Select EQPSerialNo,EquipmentNo,EquipmentState,EquipmentType,UserNo,StartTime,To_Date('" + Strings.Format(Conversions.ToDate(datEventTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),Description " + " From tblEMSEquipmentState " + " Where EquipmentNo = '" +
drTemp["EquipmentNo"] + "'");
colSQL.Add(strSQL);
colSQL_Rows.Add(1);
// 更新EMSEquipmentState
strSQL = Conversions.ToString("Update tblEMSEquipmentState Set " + "EquipmentState = " +
drEQP["EquipmentState"] + "," + "StartTime = To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") +
"','YYYY/MM/DD HH24:MI:SS') ," + "EQPSerialNo = '" + strEQPSerialNo + "'," + "Description ='AutoRun'," +
"UserNo = 'AutoRun'" + "Where EquipmentNo = '" + drTemp["EquipmentNo"] + "'");
colSQL.Add(strSQL);
colSQL_Rows.Add(1);
}
}
drTemp.Dispose();
}
}
}
}
}
}
// 2.保養工單開立處理
if (blnAutoCreateWO == true)
{
if (strWONo == "未開工單")
{
strWONo = InitPMWONo();
intWOItemNo = 0;
strSQL = "Insert into tblPMWoBasis(WONo,WOType,IssueState,CreateDate,Creator,Description) " +
" Values ('" + strWONo + "'," + intWOType + ",2,To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),'Auto Run','Auto Run Create')";
colSQL.Add(strSQL);
colSQL_Rows.Add(1);
}
intWOItemNo += 1;
// 保養工單開立及自動下線: 需為保養工單開立即下線且不為提前開單(BeforehandDay=0)的工單且設備狀態檢核通過才可直接下線
if (blnCreateAndReleaseWO == true && Conversions.ToInteger(drEQP["BeforehandDay"]) == 0 && blnChkEQPState == true)
{
// 保養工單開立後直接下線, 狀態為2, ReleaseDate為目前時間
strSQL = "Insert into tblPMWODetail(" + " WONo,WOItemNo,PMSerialNo,EquipmentNo,PMEQPSOPNo,PMSOPNO,PMESTDATETIME,RELEASEDATE,WOStatus,SerialNo)" + " Values('"
+ strWONo + "'," + intWOItemNo + "," + drEQP["PMSerialNo"] + ",'" + drEQP["EquipmentNo"] + "','" + drEQP["PMEQPSOPNo"] + "','" + drEQP["PMSOPNO"] + "'," +
" To_Date('" + Strings.Format(drEQP["PMESTDATETIME"], "yyyy/MM/dd") + "','YYYY/MM/DD')" + ", To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd") + "','YYYY/MM/DD'), 2,'" + drEQP["SerialNo"] + "')";
colSQL.Add(strSQL);
colSQL_Rows.Add(1);
// ExecuteState=3表示已下線工單, WOReleaseDate為目前時間
strSQL = "Insert into tblPMEQPMaintenancePlanLog(SerialNo,PMSerialNo,EquipmentNo,PMEQPSOPNo,FrequencyNo,PMSOPNo,PMEstDateTime,Creator,CreateDate,Reviser,ReviseDate," +
"ExecuteState,PMWONo,PMWoItemNo,WOCreateDate,LogCreator,LogCreateDate,WOReleaseDate) " +
" Select SerialNo,PMSerialNo,EquipmentNo,PMEQPSOPNo,FrequencyNo,PMSOPNo,PMEstDateTime,Creator,CreateDate," + " Reviser,ReviseDate,3,'" + strWONo + "'," + intWOItemNo + "," +
" To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd") + "','YYYY/MM/DD'),'Auto Run'," + " To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd") + "','YYYY/MM/DD'), " +
" To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd") + "','YYYY/MM/DD') " + " From tblPMEQPMaintenancePlan " + " Where SerialNo='" + drEQP["SerialNo"] + "'";
colSQL.Add(strSQL);
colSQL_Rows.Add(1);
}
else
{
// 保養工單開立後不直接下線, 狀態為1:待料, ReleaseDate為空
strSQL = "Insert into tblPMWODetail(" + " WONo,WOItemNo,PMSerialNo,EquipmentNo,PMEQPSOPNo,PMSOPNO,PMESTDATETIME,WOStatus,SerialNo)" + " Values('"
+ strWONo + "'," + intWOItemNo + "," + drEQP["PMSerialNo"] + ",'" + drEQP["EquipmentNo"] + "','" + drEQP["PMEQPSOPNo"] + "','" + drEQP["PMSOPNO"] + "'," +
" To_Date('" + Strings.Format(drEQP["PMESTDATETIME"], "yyyy/MM/dd") + "','YYYY/MM/DD'),1,'" + drEQP["SerialNo"] + "')";
colSQL.Add(strSQL);
colSQL_Rows.Add(1);
// ExecuteState=2表示工單開立, WOReleaseDate為空
strSQL = "Insert into tblPMEQPMaintenancePlanLog(SerialNo,PMSerialNo,EquipmentNo,PMEQPSOPNo,FrequencyNo,PMSOPNo,PMEstDateTime,Creator,CreateDate,Reviser,ReviseDate," +
"ExecuteState,PMWONo,PMWoItemNo,WOCreateDate,LogCreator,LogCreateDate) " +
" Select SerialNo,PMSerialNo,EquipmentNo,PMEQPSOPNo,FrequencyNo,PMSOPNo,PMEstDateTime,Creator,CreateDate," + " Reviser,ReviseDate,2,'" + strWONo + "'," + intWOItemNo + "," +
" To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd") + "','YYYY/MM/DD'),'Auto Run'," + " To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd") + "','YYYY/MM/DD') " +
" From tblPMEQPMaintenancePlan " + " Where SerialNo='" + drEQP["SerialNo"] + "'";
colSQL.Add(strSQL);
colSQL_Rows.Add(1);
}
// 清除PMEQPMaintancePlan資料
strSQL = Conversions.ToString("Delete From tblPMEQPMaintenancePlan Where SerialNo='" + drEQP["SerialNo"] + "'");
colSQL.Add(strSQL);
colSQL_Rows.Add(1);
}
// 3.Mail發送處理
if (blnAutoEmail == true)
{
drAdd = dtSendMail.NewRow();
drAdd["WONo"] = strWONo;
drAdd["EquipmentNo"] = drEQP["EquipmentNo"] + "";
drAdd["EquipmentName"] = drEQP["EquipmentName"] + "";
drAdd["FrequencyName"] = drEQP["FrequencyName"] + "";
drAdd["PMSOPName"] = drEQP["PMSOPName"] + "";
drAdd["EngineerGroupNo"] = drEQP["EngineerGroupNo"] + "";
dtSendMail.Rows.Add(drAdd);
}
// 4. 更新設備的PMEqupmentState
strSQL = Conversions.ToString("Update tblPMEquipmentState Set SincePMQty = 0, SincePMTimes = 0, LastPMDate = To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')" + " Where EquipmentNo = '" +
drEQP["EquipmentNo"] + "'");
colSQL.Add(strSQL);
colSQL_Rows.Add(1);
}
ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colSQL, colSQL_Rows);
}
dtSendMail = dtSendMail.DefaultView.ToTable(true, new[] { "WONo", "EquipmentNo", "FrequencyName", "PMSOPName", "EngineerGroupNo" });
foreach (DataRow rowGroupNo in dtSendMail.DefaultView.ToTable(true, "EngineerGroupNo").Rows)
{
strSendMailMSG = "PM Work Order
";
foreach (DataRow row in dtSendMail.Select(Conversions.ToString("EngineerGroupNo = '" + rowGroupNo["EngineerGroupNo"] + "'")))
{
strSendMailMSG = Conversions.ToString(strSendMailMSG + "WONo: " + row["WONo"] + "
");
strSendMailMSG = Conversions.ToString(strSendMailMSG + "EquipemntNo: " + row["EquipmentNo"] + "
");
strSendMailMSG = Conversions.ToString(strSendMailMSG + "PMSOPName: " + row["PMSOPName"] + "
");
strSendMailMSG = Conversions.ToString(strSendMailMSG + "FrequencyName: " + row["FrequencyName"] + "
");
}
if (!string.IsNullOrEmpty(strSendMailMSG))
{
strSendMailMSG += "";
string argFileName = "N/A";
string argEmailSubject = "PM Work Order";
modAutoRunLibrary.SendMultiEmail(ref argFileName, ref argEmailSubject, strSendMailMSG, Conversions.ToString(rowGroupNo["EngineerGroupNo"]), GroupType: (modAutoRunLibrary.GroupType)2);
}
}
//當參數1「已開立工單逾保養日自動下線」的值為Y時,需查核透過 Auto Run 所自動開立的預防保養工單(tblPMWoBasis.Creator = Auto Run And tblPMWoBasis.WOType = 0),
//若已超過其預定保養日(PMEstDateTime),但該保養工單還未下線(包含這次所開立的保養工單及不排除提早開單的工單),則將該保養工單做下線,
//設備狀態則依該保養工單所對應的設備保養標準程序(PM201)中,所設定是否改變設備狀態,來決定要不要改變設備狀態,若設定要變更設備狀態,但設備狀態無法變更時,就不下線該保養工單。
if (colParameters["Parameter01"].ToString() == "Y")
{
bool blnReleaseWO = true;
datEventTime = DateTime.Now;
//取出已到期的保養計劃(預估保養日PMEstDateTime <= Now)
strSQL = " Select A.*,B.EquipmentNo,B.SerialNo,C.LockEquipment, C.EquipmentState" +
" From tblPMWoDetail A Join tblPMWOBasis Basis On A.WONo = Basis.WONo" +
" Join tblPMEQPMaintenancePlanLog B On A.WONo = B.PMWONo" +
" Join tblPMEQPTypeSOPBasis C On B.PMEQPSOPNo = C.PMEQPSOPNo" +
" Where Basis.Creator = 'Auto Run' And A.WOStatus = 1 And B.PMEstDateTime < To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd") + "','YYYY/MM/DD') ";
strSQL = SQLCommandTuning(strDataBaseType, ref strSQL);
ExecuteSQLQuery_Adapter(strSQL, dsTemp, "OverPMDate", cnnTemp);
// 組出應保養的設備List
EquipmentNoList = "";
foreach (DataRow row in dsTemp.Tables["OverPMDate"].DefaultView.ToTable(true, "EquipmentNo").Rows)
EquipmentNoList = Conversions.ToString(EquipmentNoList + row["EquipmentNo"] + ",");
EquipmentNoList = EquipmentNoList.TrimEnd(',');
// 取出各設備的EMSEquipmentState
if (dsTemp.Tables["EMSEquipmentState"] != null)
{
dsTemp.Tables.Remove(dsTemp.Tables["EMSEquipmentState"]);
}
strSQL = "Select * From tblEMSEquipmentState Where EquipmentNo In ('" + Strings.Replace(EquipmentNoList, ",", "','") + "')";
ExecuteSQLQuery_Adapter(strSQL, dsTemp, "EMSEquipmentState", cnnTemp);
foreach (DataRow row in dsTemp.Tables["OverPMDate"].Rows)
{
colSQL.Clear();
colSQL_Rows.Clear();
blnReleaseWO = true;
if (row["LockEquipment"].ToString() == "1" && !string.IsNullOrEmpty(row["EquipmentState"].ToString())) //需改變設備狀態
{
drSel = dsTemp.Tables["EMSEquipmentState"].Select("EquipmentNo = '" + row["EquipmentNo"] + "'");
if (drSel.Length > 0)
{
// 設備狀態不相等且互斥則不可下線
if (drSel[0]["EquipmentState"] != row["EquipmentState"] && dsTemp.Tables["ViolateStatusChange"].Select("EquipmentState = " + drSel[0]["EquipmentState"] + " And ViolativeState = " + row["EquipmentState"]).Length > 0)
{
blnReleaseWO = false;
}
}
}
if (blnReleaseWO == true)
{
strSQL = "Update tblPMWODetail Set WOStatus = 2, ReleaseDate = To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd") + "','YYYY/MM/DD') Where WONo = '" + row["WONo"] + "' And WOItemNo = " + row["WOItemNo"];
colSQL.Add(strSQL);
colSQL_Rows.Add(1);
strSQL = "Update tblPMEQPMaintenancePlanLog Set ExecuteState = 3, WOReleaseDate = To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd") + "','YYYY/MM/DD') Where SerialNo = '" + row["SerialNo"] + "'";
colSQL.Add(strSQL);
colSQL_Rows.Add(1);
ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colSQL, colSQL_Rows);
}
}
}
if (!string.IsNullOrEmpty(strFailMsg))
{
funPMWOAutoCreate_EQPTypeSOPRet = "fail;" + strFailMsg;
}
else
{
funPMWOAutoCreate_EQPTypeSOPRet = "success";
}
}
catch (Exception ex)
{
funPMWOAutoCreate_EQPTypeSOPRet = CombineFailMsg("0000-999999", ex.Message);
}
finally
{
// //釋放資源
if (dsTemp != null)
{
dsTemp.Dispose();
dsTemp = null;
}
//if (daTemp != null)
//{
// daTemp.Dispose();
// daTemp = null;
//}
colSQL = null;
colSQL_Rows = null;
// //Close Connection
CloseConnection(cnnTemp);
}
return funPMWOAutoCreate_EQPTypeSOPRet;
}
private string funPMWOAutoCreate_FixedQty(Collection colParameters = null)
{
string funPMWOAutoCreate_FixedQtyRet = default(string);
var cnnTemp = default(IDbConnection);
//var daTemp = default(System.Data.OleDb.OleDbDataAdapter);
var colSQL = new Collection();
var colSQL_Rows = new Collection();
var dsTemp = new DataSet();
DataRow[] drSel;
string strSQL;
string strWONo;
DateTime datEventTime;
int intWOItemNo = 0;
bool blnAutoCreateWO, blnLockEquipment, blnAutoEmail;
DataRow drAdd;
var dtSendMail = BuildMailTable();
string strSendMailMSG;
string EquipmentNoList = "";
string strEQPSerialNo;
int intWOType = 2; // 定量保養工單
string strFailMsg = "";
var dsChamber = new DataSet();
string ChamberManage = defString;
DbDataReader drTemp;
try
{
datEventTime = DateTime.Now;
cnnTemp = CreateConnection(strConnectionString);
// 取出數量已到的設備(SincePMQty >= Quantity)
// 2019/12/5, Ning, 改用 Left Join tblPMSOPBasis
//2023/3/9,Ning,若有設定寬限數量(tblPMFixedQtyPMBasis.ToleranceQty<>0), 則改成取出已達寬限數量的設備(TypeCode:0 -> EquipmentNo ,1 -> EquipmentType)
strSQL = " Select A.*,B.EquipmentNo,B.SincePMQty,C.EquipmentName,C.EngineerGroupNo,D.PMSOPName " + " From tblPMFixedQtyPMBasis A Join tblPMEquipmentState B On A.EquipmentNo = B.EquipmentNo" +
" Join tblEQPEquipmentBasis C On A.EquipmentNo = C.EquipmentNo" + " Left Join tblPMSOPBasis D On A.PMSOPNo = D.PMSOPNo" +
" Where A.TypeCode = 0 And ((B.SincePMQty >= A.Quantity And A.ToleranceQty = 0) OR (B.SincePMQty >= A.ToleranceQty And A.ToleranceQty <> 0))";
// strSQL = " Select A.*,B.EquipmentNo,B.SincePMQty,C.EquipmentName,C.EngineerGroupNo,D.PMSOPName " &
// " From tblPMFixedQtyPMBasis A,tblPMEquipmentState B,tblEQPEquipmentBasis C, tblPMSOPBasis D " &
// " Where A.TypeCode = 0 And A.EquipmentNo = B.EquipmentNo And B.EquipmentNo = C.EquipmentNo And A.PMSOPNo = D.PMSOPNo" &
// " And B.SincePMQty >= A.Quantity "
//cmmTemp = new IDbCommand(strSQL, cnnTemp);
//daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp);
//daTemp.Fill(dsTemp, "PMEQP");
//daTemp.Dispose();
ExecuteSQLQuery_Adapter(strSQL, dsTemp, "PMEQP", cnnTemp);
// 取出設備狀態互斥設定
//cmmTemp.CommandText = "Select * From tblEMSViolateStatusChange";
//daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp);
//daTemp.Fill(dsTemp, "ViolateStatusChange");
//daTemp.Dispose();
strSQL = "Select * From tblEMSViolateStatusChange";
ExecuteSQLQuery_Adapter(strSQL, dsTemp, "ViolateStatusChange", cnnTemp);
// 組出應保養的設備List
foreach (DataRow drEQP in dsTemp.Tables["PMEQP"].Rows)
EquipmentNoList = Conversions.ToString(EquipmentNoList + drEQP["EquipmentNo"] + ",");
EquipmentNoList = EquipmentNoList.TrimEnd(',');
// 取出各設備的EMSEquipmentState
//cmmTemp.CommandText = "Select * From tblEMSEquipmentState Where EquipmentNo In ('" + Strings.Replace(EquipmentNoList, ",", "','") + "')";
//daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp);
//daTemp.Fill(dsTemp, "EMSEquipmentState");
//daTemp.Dispose();
strSQL = "Select * From tblEMSEquipmentState Where EquipmentNo In ('" + Strings.Replace(EquipmentNoList, ",", "','") + "')";
ExecuteSQLQuery_Adapter(strSQL, dsTemp, "EMSEquipmentState", cnnTemp);
strSQL = "Select PARAMETERVALUE from tblSYSParameter where PARAMETERNO = 'ChamberManage'";
//cmmTemp = new IDbCommand(strSQL, cnnTemp);
drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp);
if (drTemp.Read())
{
ChamberManage = drTemp["PARAMETERVALUE"].ToString();
}
drTemp.Dispose();
// 依每筆設備的定量保養設定來開立保養工單(同一設備類別開一張保養工單)
foreach (DataRow drEQPType in dsTemp.Tables["PMEQP"].DefaultView.ToTable(true, new[] { "EquipmentType", "AutoCreateWO", "LockEquipment", "AutoEmail" }).Rows)
{
colSQL.Clear();
colSQL_Rows.Clear();
strWONo = "未開工單";
if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drEQPType["AutoCreateWO"], 1, false)))
{
blnAutoCreateWO = true;
}
else
{
blnAutoCreateWO = false;
}
if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drEQPType["LockEquipment"], 1, false))) // 變更機台狀態
{
blnLockEquipment = true;
}
else
{
blnLockEquipment = false;
}
if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drEQPType["AutoEmail"], 1, false))) // 是否要發送Mail
{
blnAutoEmail = true;
}
else
{
blnAutoEmail = false;
}
foreach (DataRow drEQP in dsTemp.Tables["PMEQP"].Select(Conversions.ToString("EquipmentType = '" + drEQPType["EquipmentType"] + "'")))
{
if (string.IsNullOrEmpty(drEQP["PMSOPName"].ToString()))
{
if (!string.IsNullOrEmpty(strFailMsg))
{
strFailMsg = Conversions.ToString(strFailMsg + Constants.vbCrLf + "[PMSOPBasis does not exist, PMSOPNo:" +
drEQP["PMSOPNo"] + "]");
}
else
{
strFailMsg = Conversions.ToString("[PMSOPBasis does not exist, PMSOPNo:" + drEQP["PMSOPNo"] + "]");
}
continue;
}
// 設備狀態變更處理
if (blnLockEquipment == true && !string.IsNullOrEmpty(drEQP["EquipmentState"].ToString()))
{
drSel = dsTemp.Tables["EMSEquipmentState"].Select(Conversions.ToString("EquipmentNo = '" + drEQP["EquipmentNo"] + "'"));
if (drSel.Length > 0)
{
// 狀態互斥則續下筆
if (dsTemp.Tables["ViolateStatusChange"].Select(Conversions.ToString("EquipmentState = " +
drSel[0]["EquipmentState"] + " And ViolativeState = " + drEQP["EquipmentState"])).Length > 0)
{
continue;
}
if (Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(drSel[0]["EquipmentState"], drEQP["EquipmentState"], false))) // 狀態不同才需改變設備狀態
{
strEQPSerialNo = InitEQPSerialNo();
if (strEQPSerialNo == "fail")
{
funPMWOAutoCreate_FixedQtyRet = "fail;[Get InitEQPSerialNo fail]";
return funPMWOAutoCreate_FixedQtyRet;
}
// Del Same EQPSerialNo
strSQL = Conversions.ToString("Delete tblEMSEquipmentStateLog Where EQPSerialNo = '" + drSel[0]["EQPSerialNo"] + "'");
colSQL.Add(strSQL);
colSQL_Rows.Add(-1);
// Add EMSEquipmentStateLog
strSQL = Conversions.ToString(" Insert into tblEMSEquipmentStateLog (EQPSerialNo,EquipmentNo,EquipmentState,EquipmentType,UserNo,StartTime,EndTime,Description) " + " Select EQPSerialNo,EquipmentNo,EquipmentState,EquipmentType,UserNo,StartTime,To_Date('" + Strings.Format(Conversions.ToDate(datEventTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),Description " + " From tblEMSEquipmentState " + " Where EquipmentNo = '" +
drEQP["EquipmentNo"] + "'");
colSQL.Add(strSQL);
colSQL_Rows.Add(1);
// 更新EMSEquipmentState, 以EquipmentState做RowCount查核
strSQL = Conversions.ToString("Update tblEMSEquipmentState Set " + "EquipmentState = " +
drEQP["EquipmentState"] + "," + "StartTime = To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') ," +
"EQPSerialNo = '" + strEQPSerialNo + "'," + "Description ='AutoRun'," + "UserNo = 'AutoRun'" + "Where EquipmentNo = '" + drEQP["EquipmentNo"] +
"' And EquipmentState = " + drSel[0]["EquipmentState"]);
colSQL.Add(strSQL);
colSQL_Rows.Add(1);
// 若開啟子設備管理,則須更新設備下子設備的設備狀態
if (ChamberManage == "1")
{
strSQL = "Select EquipmentNo from tblEQPEquipmentBasis Where BELONGEQUIPMENTNO = '" + drEQP["EquipmentNo"].ToString() + "'";
//cmmTemp = new IDbCommand(strSQL, cnnTemp);
//daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp);
dsChamber = new DataSet();
//daTemp.Fill(dsChamber, "ChamberData");
//daTemp.Dispose();
ExecuteSQLQuery_Adapter(strSQL, dsChamber, "ChamberData", cnnTemp);
foreach (DataRow dr in dsChamber.Tables["ChamberData"].Rows)
{
strSQL = "Select * From tblEMSEquipmentState Where EquipmentNo = '" + dr["EquipmentNo"].ToString() + "'";
//cmmTemp = new IDbCommand(strSQL, cnnTemp);
drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp);
if (drTemp.Read())
{
// 設備狀態不同才變更
if (Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(drEQP["EquipmentState"], drTemp["EquipmentState"], false)))
{
strEQPSerialNo = InitEQPSerialNo();
if (strEQPSerialNo == "fail")
{
funPMWOAutoCreate_FixedQtyRet = "fail;[Get InitEQPSerialNo fail]";
return funPMWOAutoCreate_FixedQtyRet;
}
// Del Same EQPSerialNo
strSQL = Conversions.ToString("Delete tblEMSEquipmentStateLog Where EQPSerialNo = '" +
drTemp["EQPSerialNo"] + "'");
colSQL.Add(strSQL);
colSQL_Rows.Add(-1);
// Add EMSEquipmentStateLog
strSQL = Conversions.ToString(" Insert into tblEMSEquipmentStateLog (EQPSerialNo,EquipmentNo,EquipmentState,EquipmentType,UserNo,StartTime,EndTime,Description) " + " Select EQPSerialNo,EquipmentNo,EquipmentState,EquipmentType,UserNo,StartTime,To_Date('" + Strings.Format(Conversions.ToDate(datEventTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),Description " + " From tblEMSEquipmentState " + " Where EquipmentNo = '" +
drTemp["EquipmentNo"] + "'");
colSQL.Add(strSQL);
colSQL_Rows.Add(1);
// 更新EMSEquipmentState
strSQL = Conversions.ToString("Update tblEMSEquipmentState Set " + "EquipmentState = " +
drEQP["EquipmentState"] + "," + "StartTime = To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") +
"','YYYY/MM/DD HH24:MI:SS') ," + "EQPSerialNo = '" + strEQPSerialNo + "'," + "Description ='AutoRun'," + "UserNo = 'AutoRun'" +
"Where EquipmentNo = '" + drTemp["EquipmentNo"] + "'");
colSQL.Add(strSQL);
colSQL_Rows.Add(1);
}
}
drTemp.Dispose();
}
}
}
}
}
// 2.保養工單開立處理
if (blnAutoCreateWO == true)
{
if (strWONo == "未開工單")
{
strWONo = InitPMWONo();
intWOItemNo = 0;
strSQL = "Insert into tblPMWoBasis(WONo,WOType,IssueState,CreateDate,Creator,Description) " + " Values ('" + strWONo + "'," + intWOType + ",2,To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),'Auto Run','Auto Run Create')";
colSQL.Add(strSQL);
colSQL_Rows.Add(1);
}
intWOItemNo += 1;
// 保養工單開立後直接下線, WOStatus = 2
// 2020/4/29, Ning, 保養工單開立後不直接下線, 狀態為1:待料
strSQL = "Insert into tblPMWODetail(WONo,WOItemNo,PMSerialNo,EquipmentNo,PMSOPNO,PMESTDATETIME,WOStatus) Values('" +
strWONo + "'," + intWOItemNo + "," + intWOItemNo + ",'" + drEQP["EquipmentNo"] + "','" + drEQP["PMSOPNO"] + "'," +
" To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd") + "','YYYY/MM/DD'),1)";
colSQL.Add(strSQL);
colSQL_Rows.Add(1);
}
// 3.Mail發送處理
if (blnAutoEmail == true)
{
drAdd = dtSendMail.NewRow();
drAdd["WONo"] = strWONo;
drAdd["EquipmentNo"] = drEQP["EquipmentNo"] + "";
drAdd["EquipmentName"] = drEQP["EquipmentName"] + "";
drAdd["PMSOPName"] = drEQP["PMSOPName"] + "";
drAdd["EngineerGroupNo"] = drEQP["EngineerGroupNo"] + "";
dtSendMail.Rows.Add(drAdd);
}
// 4. 更新設備的PMEqupmentState
strSQL = Conversions.ToString("Update tblPMEquipmentState Set SincePMQty = 0, SincePMTimes = 0, LastPMDate = To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')" + " Where EquipmentNo = '" +
drEQP["EquipmentNo"] + "'");
colSQL.Add(strSQL);
colSQL_Rows.Add(1);
}
ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colSQL, colSQL_Rows);
}
dtSendMail = dtSendMail.DefaultView.ToTable(true, new[] { "WONo", "EquipmentNo", "PMSOPName", "EngineerGroupNo" });
foreach (DataRow rowGroupNo in dtSendMail.DefaultView.ToTable(true, "EngineerGroupNo").Rows)
{
strSendMailMSG = "Fixed Qty Work Order
";
foreach (DataRow row in dtSendMail.Select(Conversions.ToString("EngineerGroupNo = '" + rowGroupNo["EngineerGroupNo"] + "'")))
{
strSendMailMSG = Conversions.ToString(strSendMailMSG + "WONo: " + row["WONo"] + "
");
strSendMailMSG = Conversions.ToString(strSendMailMSG + "EquipemntNo: " + row["EquipmentNo"] + "
");
strSendMailMSG = Conversions.ToString(strSendMailMSG + "PMSOPName: " + row["PMSOPName"] + "
");
}
if (!string.IsNullOrEmpty(strSendMailMSG))
{
strSendMailMSG += "";
string argFileName = "N/A";
string argEmailSubject = "Fixed Qty Work Order";
modAutoRunLibrary.SendMultiEmail(ref argFileName, ref argEmailSubject, strSendMailMSG, Conversions.ToString(rowGroupNo["EngineerGroupNo"]), GroupType: (modAutoRunLibrary.GroupType)2);
}
}
if (!string.IsNullOrEmpty(strFailMsg))
{
funPMWOAutoCreate_FixedQtyRet = "fail;" + strFailMsg;
}
else
{
funPMWOAutoCreate_FixedQtyRet = "success";
}
}
catch (Exception ex)
{
funPMWOAutoCreate_FixedQtyRet = CombineFailMsg("0000-999999", ex.Message + ",StackTrace:" + ex.StackTrace + "]");
}
finally
{
// //釋放資源
if (dsTemp != null)
{
dsTemp.Dispose();
dsTemp = null;
}
//if (daTemp != null)
//{
// daTemp.Dispose();
// daTemp = null;
//}
colSQL = null;
colSQL_Rows = null;
// //Close Connection
CloseConnection(cnnTemp);
}
return funPMWOAutoCreate_FixedQtyRet;
}
private string funPMWOAutoCreate_FixedTimes(Collection colParameters = null)
{
string funPMWOAutoCreate_FixedTimesRet = default(string);
var cnnTemp = default(IDbConnection);
//var daTemp = default(System.Data.OleDb.OleDbDataAdapter);
var colSQL = new Collection();
var colSQL_Rows = new Collection();
var dsTemp = new DataSet();
DataRow[] drSel;
var dsChamber = new DataSet();
string strSQL;
string strWONo;
DateTime datEventTime;
int intWOItemNo = 0;
bool blnAutoCreateWO, blnLockEquipment, blnAutoEmail;
DataRow drAdd;
var dtSendMail = BuildMailTable();
string strSendMailMSG;
string EquipmentNoList = "";
string strEQPSerialNo;
int intWOType = 3; // 定次定時保養工單
string strFailMsg = "";
string ChamberManage = defString;
DbDataReader drTemp;
try
{
datEventTime = DateTime.Now;
cnnTemp = CreateConnection(strConnectionString);
// 取出定次(QtyType = 0)已到的設備(SincePMTimes >= Quantity)
// 2019/12/5, Ning, 改用 Left Join tblPMSOPBasis
strSQL = " Select A.*,B.EquipmentNo,B.SincePMQty,C.EquipmentName,C.EngineerGroupNo,D.PMSOPName " + " From tblPMFixedTimesPMBasis A Join tblPMEquipmentState B On A.EquipmentNo = B.EquipmentNo" +
" Join tblEQPEquipmentBasis C On A.EquipmentNo = C.EquipmentNo" + " Left Join tblPMSOPBasis D On A.PMSOPNo = D.PMSOPNo" +
" Where A.QtyType = 0 And A.TypeCode = 0 And ((B.SincePMTimes >= A.Quantity And A.ToleranceQty = 0) OR (B.SincePMTimes >= A.ToleranceQty And A.ToleranceQty <> 0))";
//cmmTemp = new IDbCommand(strSQL, cnnTemp);
//daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp);
//daTemp.Fill(dsTemp, "PMEQP");
//daTemp.Dispose();
ExecuteSQLQuery_Adapter(strSQL, dsTemp, "PMEQP", cnnTemp);
// 取出定時(QtyType = 1, Hours)已到的設備(上次保養至今 >= Quantity)
if (strDataBaseType == "oracle")
{
strSQL = " Select A.*,B.EquipmentNo,B.SincePMQty,C.EquipmentName,C.EngineerGroupNo,D.PMSOPName " + " From tblPMFixedTimesPMBasis A Join tblPMEquipmentState B On A.EquipmentNo = B.EquipmentNo" +
" Join tblEQPEquipmentBasis C On A.EquipmentNo = C.EquipmentNo" + " Left Join tblPMSOPBasis D On A.PMSOPNo = D.PMSOPNo" + " Where A.QtyType = 1 And A.TypeCode = 0" +
" And ((B.LastPMDate Is Not Null And (To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') - LastPMDate) * 24 >= A.Quantity And A.ToleranceQty = 0) OR" +
" (B.LastPMDate Is Not Null And (To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') - LastPMDate) * 24 >= A.ToleranceQty And A.ToleranceQty <> 0))";
}
else if (Conversions.ToBoolean(Operators.OrObject(strDataBaseType == "mssql", Operators.ConditionalCompareObjectEqual(DataBaseType, "msaccess", false)))) // SQL與Access語法相同
{
strSQL = " Select A.*,B.EquipmentNo,B.SincePMQty,C.EquipmentName,C.EngineerGroupNo,D.PMSOPName " +
" From tblPMFixedTimesPMBasis A Join tblPMEquipmentState B On A.EquipmentNo = B.EquipmentNo" + " Join tblEQPEquipmentBasis C On A.EquipmentNo = C.EquipmentNo" +
" Left Join tblPMSOPBasis D On A.PMSOPNo = D.PMSOPNo" + " Where A.QtyType = 1 And A.TypeCode = 0" +
" And ((B.LastPMDate Is Not Null And DateDiff(hh, LastPMDate, '" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "') >= A.Quantity And A.ToleranceQty = 0) OR" +
" (B.LastPMDate Is Not Null And DateDiff(hh, LastPMDate, '" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "') >= A.ToleranceQty And A.ToleranceQty <> 0))";
}
//cmmTemp = new IDbCommand(strSQL, cnnTemp);
//daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp);
//daTemp.Fill(dsTemp, "PMEQP");
//daTemp.Dispose();
ExecuteSQLQuery_Adapter(strSQL, dsTemp, "PMEQP", cnnTemp);
// 取出定時(QtyType = 2, Minutes)已到的設備(上次保養至今 >= Quantity)
if (strDataBaseType == "oracle")
{
strSQL = " Select A.*,B.EquipmentNo,B.SincePMQty,C.EquipmentName,C.EngineerGroupNo,D.PMSOPName " + " From tblPMFixedTimesPMBasis A Join tblPMEquipmentState B On A.EquipmentNo = B.EquipmentNo" +
" Join tblEQPEquipmentBasis C On A.EquipmentNo = C.EquipmentNo" + " Left Join tblPMSOPBasis D On A.PMSOPNo = D.PMSOPNo" + " Where A.QtyType = 2 And A.TypeCode = 0" +
" And ((B.LastPMDate Is Not Null And (To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') - LastPMDate)*24*60 >= A.Quantity And A.ToleranceQty = 0) OR" +
" (B.LastPMDate Is Not Null And (To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') - LastPMDate)*24*60 >= A.ToleranceQty And A.ToleranceQty <> 0))";
}
else if (Conversions.ToBoolean(Operators.OrObject(strDataBaseType == "mssql", Operators.ConditionalCompareObjectEqual(DataBaseType, "msaccess", false)))) // SQL與Access語法相同
{
strSQL = " Select A.*,B.EquipmentNo,B.SincePMQty,C.EquipmentName,C.EngineerGroupNo,D.PMSOPName " + " From tblPMFixedTimesPMBasis A Join tblPMEquipmentState B On A.EquipmentNo = B.EquipmentNo" +
" Join tblEQPEquipmentBasis C On A.EquipmentNo = C.EquipmentNo" + " Left Join tblPMSOPBasis D On A.PMSOPNo = D.PMSOPNo" + " Where A.QtyType = 2 And A.TypeCode = 0" +
" And ((B.LastPMDate Is Not Null And DateDiff(mi, LastPMDate, '" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "') >= A.Quantity And A.ToleranceQty = 0) OR" +
" (B.LastPMDate Is Not Null And DateDiff(mi, LastPMDate, '" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "') >= A.ToleranceQty And A.ToleranceQty <> 0))";
}
//cmmTemp = new IDbCommand(strSQL, cnnTemp);
//daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp);
//daTemp.Fill(dsTemp, "PMEQP");
//daTemp.Dispose();
ExecuteSQLQuery_Adapter(strSQL, dsTemp, "PMEQP", cnnTemp);
// 取出設備狀態互斥設定
//cmmTemp.CommandText = "Select * From tblEMSViolateStatusChange";
//daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp);
//daTemp.Fill(dsTemp, "ViolateStatusChange");
//daTemp.Dispose();
strSQL = "Select * From tblEMSViolateStatusChange";
ExecuteSQLQuery_Adapter(strSQL, dsTemp, "ViolateStatusChange", cnnTemp);
// 組出應保養的設備List
foreach (DataRow drEQP in dsTemp.Tables["PMEQP"].Rows)
EquipmentNoList = Conversions.ToString(EquipmentNoList + drEQP["EquipmentNo"] + ",");
EquipmentNoList = EquipmentNoList.TrimEnd(',');
// 取出各設備的EMSEquipmentState
//cmmTemp.CommandText = "Select * From tblEMSEquipmentState Where EquipmentNo In ('" + Strings.Replace(EquipmentNoList, ",", "','") + "')";
//daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp);
//daTemp.Fill(dsTemp, "EMSEquipmentState");
//daTemp.Dispose();
strSQL = "Select * From tblEMSEquipmentState Where EquipmentNo In ('" + Strings.Replace(EquipmentNoList, ",", "','") + "')";
ExecuteSQLQuery_Adapter(strSQL, dsTemp, "EMSEquipmentState", cnnTemp);
// 2021/10/14 Mantis:0100751 當啟用系統參數:子設備管理,改變設備狀態時,需一併更新設備底下子設備的狀態
strSQL = "Select PARAMETERVALUE from tblSYSParameter where PARAMETERNO = 'ChamberManage'";
//cmmTemp = new IDbCommand(strSQL, cnnTemp);
drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp);
if (drTemp.Read())
{
ChamberManage = drTemp["PARAMETERVALUE"].ToString();
}
drTemp.Dispose();
// 依每筆設備的定量保養設定來開立保養工單(同一設備類別開一張保養工單)
foreach (DataRow drEQPType in dsTemp.Tables["PMEQP"].DefaultView.ToTable(true, new[] { "EquipmentType", "AutoCreateWO", "LockEquipment", "AutoEmail" }).Rows)
{
colSQL.Clear();
colSQL_Rows.Clear();
strWONo = "未開工單";
if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drEQPType["AutoCreateWO"], 1, false)))
{
blnAutoCreateWO = true;
}
else
{
blnAutoCreateWO = false;
}
if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drEQPType["LockEquipment"], 1, false))) // 變更機台狀態
{
blnLockEquipment = true;
}
else
{
blnLockEquipment = false;
}
if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drEQPType["AutoEmail"], 1, false))) // 是否要發送Mail
{
blnAutoEmail = true;
}
else
{
blnAutoEmail = false;
}
foreach (DataRow drEQP in dsTemp.Tables["PMEQP"].Select(Conversions.ToString("EquipmentType = '" + drEQPType["EquipmentType"] + "'")))
{
if (string.IsNullOrEmpty(drEQP["PMSOPName"].ToString()))
{
if (!string.IsNullOrEmpty(strFailMsg))
{
strFailMsg = Conversions.ToString(strFailMsg + Constants.vbCrLf + "[PMSOPBasis does not exist, PMSOPNo:" +
drEQP["PMSOPNo"] + "]");
}
else
{
strFailMsg = Conversions.ToString("[PMSOPBasis does not exist, PMSOPNo:" + drEQP["PMSOPNo"] + "]");
}
continue;
}
// 設備狀態變更處理
if (blnLockEquipment == true && !string.IsNullOrEmpty(drEQP["EquipmentState"].ToString()))
{
drSel = dsTemp.Tables["EMSEquipmentState"].Select(Conversions.ToString("EquipmentNo = '" + drEQP["EquipmentNo"] + "'"));
if (drSel.Length > 0)
{
// 狀態互斥則續下筆
if (dsTemp.Tables["ViolateStatusChange"].Select(Conversions.ToString("EquipmentState = " +
drSel[0]["EquipmentState"] + " And ViolativeState = " + drEQP["EquipmentState"])).Length > 0)
{
continue;
}
if (Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(drSel[0]["EquipmentState"], drEQP["EquipmentState"], false))) // 狀態不同才需改變設備狀態
{
strEQPSerialNo = InitEQPSerialNo();
if (strEQPSerialNo == "fail")
{
funPMWOAutoCreate_FixedTimesRet = "fail;[Get InitEQPSerialNo fail]";
return funPMWOAutoCreate_FixedTimesRet;
}
// Del Same EQPSerialNo
strSQL = Conversions.ToString("Delete tblEMSEquipmentStateLog Where EQPSerialNo = '" + drSel[0]["EQPSerialNo"] + "'");
colSQL.Add(strSQL);
colSQL_Rows.Add(-1);
// Add EMSEquipmentStateLog
strSQL = Conversions.ToString(" Insert into tblEMSEquipmentStateLog (EQPSerialNo,EquipmentNo,EquipmentState,EquipmentType,UserNo,StartTime,EndTime,Description) " + " Select EQPSerialNo,EquipmentNo,EquipmentState,EquipmentType,UserNo,StartTime,To_Date('" + Strings.Format(Conversions.ToDate(datEventTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),Description " + " From tblEMSEquipmentState " + " Where EquipmentNo = '" +
drEQP["EquipmentNo"] + "'");
colSQL.Add(strSQL);
colSQL_Rows.Add(1);
// 更新EMSEquipmentState, 以EquipmentState做RowCount查核
strSQL = Conversions.ToString("Update tblEMSEquipmentState Set " + "EquipmentState = " +
drEQP["EquipmentState"] + "," + "StartTime = To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') ," +
"EQPSerialNo = '" + strEQPSerialNo + "'," + "Description ='AutoRun'," + "UserNo = 'AutoRun'" + "Where EquipmentNo = '" + drEQP["EquipmentNo"] +
"' And EquipmentState = " + drSel[0]["EquipmentState"]);
colSQL.Add(strSQL);
colSQL_Rows.Add(1);
// 若開啟子設備管理,則須更新設備下子設備的設備狀態
if (ChamberManage == "1")
{
strSQL = "Select EquipmentNo from tblEQPEquipmentBasis Where BELONGEQUIPMENTNO = '" + drEQP["EquipmentNo"].ToString() + "'";
//cmmTemp = new IDbCommand(strSQL, cnnTemp);
//daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp);
//dsChamber = new DataSet();
//daTemp.Fill(dsChamber, "ChamberData");
//daTemp.Dispose();
ExecuteSQLQuery_Adapter(strSQL, dsChamber, "ChamberData", cnnTemp);
foreach (DataRow dr in dsChamber.Tables["ChamberData"].Rows)
{
strSQL = "Select * From tblEMSEquipmentState Where EquipmentNo = '" + dr["EquipmentNo"].ToString() + "'";
//cmmTemp = new IDbCommand(strSQL, cnnTemp);
drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp);
if (drTemp.Read())
{
// 設備狀態不同才變更
if (Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(drEQP["EquipmentState"], drTemp["EquipmentState"], false)))
{
strEQPSerialNo = InitEQPSerialNo();
if (strEQPSerialNo == "fail")
{
funPMWOAutoCreate_FixedTimesRet = "fail;[Get InitEQPSerialNo fail]";
return funPMWOAutoCreate_FixedTimesRet;
}
// Del Same EQPSerialNo
strSQL = Conversions.ToString("Delete tblEMSEquipmentStateLog Where EQPSerialNo = '" +
drTemp["EQPSerialNo"] + "'");
colSQL.Add(strSQL);
colSQL_Rows.Add(-1);
// Add EMSEquipmentStateLog
strSQL = Conversions.ToString(" Insert into tblEMSEquipmentStateLog (EQPSerialNo,EquipmentNo,EquipmentState,EquipmentType,UserNo,StartTime,EndTime,Description) " + " Select EQPSerialNo,EquipmentNo,EquipmentState,EquipmentType,UserNo,StartTime,To_Date('" + Strings.Format(Conversions.ToDate(datEventTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),Description " + " From tblEMSEquipmentState " + " Where EquipmentNo = '" +
drTemp["EquipmentNo"] + "'");
colSQL.Add(strSQL);
colSQL_Rows.Add(1);
// 更新EMSEquipmentState
strSQL = Conversions.ToString("Update tblEMSEquipmentState Set " + "EquipmentState = " +
drEQP["EquipmentState"] + "," + "StartTime = To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") +
"','YYYY/MM/DD HH24:MI:SS') ," + "EQPSerialNo = '" + strEQPSerialNo + "'," + "Description ='AutoRun'," + "UserNo = 'AutoRun'" +
"Where EquipmentNo = '" + drTemp["EquipmentNo"] + "'");
colSQL.Add(strSQL);
colSQL_Rows.Add(1);
}
}
drTemp.Dispose();
}
}
}
}
}
// 2.保養工單開立處理
if (blnAutoCreateWO == true)
{
if (strWONo == "未開工單")
{
strWONo = InitPMWONo();
intWOItemNo = 0;
strSQL = "Insert into tblPMWoBasis(WONo,WOType,IssueState,CreateDate,Creator,Description) " + " Values ('" + strWONo + "'," + intWOType + ",2,To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),'Auto Run','Auto Run Create')";
colSQL.Add(strSQL);
colSQL_Rows.Add(1);
}
intWOItemNo += 1;
// 保養工單開立後直接下線, WOStatus = 2
// 2020/4/29, Ning, 保養工單開立後不直接下線, 狀態為1:待料
strSQL = "Insert into tblPMWODetail(WONo,WOItemNo,PMSerialNo,EquipmentNo,PMSOPNO,PMESTDATETIME,WOStatus) Values('" +
strWONo + "'," + intWOItemNo + "," + intWOItemNo + ",'" + drEQP["EquipmentNo"] + "','" + drEQP["PMSOPNO"] + "'," +
" To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd") + "','YYYY/MM/DD'),1)";
colSQL.Add(strSQL);
colSQL_Rows.Add(1);
}
// 3.Mail發送處理
if (blnAutoEmail == true)
{
drAdd = dtSendMail.NewRow();
drAdd["WONo"] = strWONo;
drAdd["EquipmentNo"] = drEQP["EquipmentNo"] + "";
drAdd["EquipmentName"] = drEQP["EquipmentName"] + "";
drAdd["PMSOPName"] = drEQP["PMSOPName"] + "";
drAdd["EngineerGroupNo"] = drEQP["EngineerGroupNo"] + "";
dtSendMail.Rows.Add(drAdd);
}
// 4. 更新設備的PMEqupmentState
strSQL = Conversions.ToString("Update tblPMEquipmentState Set SincePMQty = 0, SincePMTimes = 0, LastPMDate = To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')" + " Where EquipmentNo = '" +
drEQP["EquipmentNo"] + "'");
colSQL.Add(strSQL);
colSQL_Rows.Add(1);
}
ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colSQL, colSQL_Rows);
}
dtSendMail = dtSendMail.DefaultView.ToTable(true, new[] { "WONo", "EquipmentNo", "PMSOPName", "EngineerGroupNo" });
foreach (DataRow rowGroupNo in dtSendMail.DefaultView.ToTable(true, "EngineerGroupNo").Rows)
{
strSendMailMSG = "Fixed Times Work Order
";
foreach (DataRow row in dtSendMail.Select(Conversions.ToString("EngineerGroupNo = '" + rowGroupNo["EngineerGroupNo"] + "'")))
{
strSendMailMSG = Conversions.ToString(strSendMailMSG + "WONo: " + row["WONo"] + "
");
strSendMailMSG = Conversions.ToString(strSendMailMSG + "EquipemntNo: " + row["EquipmentNo"] + "
");
strSendMailMSG = Conversions.ToString(strSendMailMSG + "PMSOPName: " + row["PMSOPName"] + "
");
}
if (!string.IsNullOrEmpty(strSendMailMSG))
{
strSendMailMSG += "";
string argFileName = "N/A";
string argEmailSubject = "Fixed Times Work Order";
modAutoRunLibrary.SendMultiEmail(ref argFileName, ref argEmailSubject, strSendMailMSG, Conversions.ToString(rowGroupNo["EngineerGroupNo"]), GroupType: (modAutoRunLibrary.GroupType)2);
}
}
if (!string.IsNullOrEmpty(strFailMsg))
{
funPMWOAutoCreate_FixedTimesRet = "fail;" + strFailMsg;
}
else
{
funPMWOAutoCreate_FixedTimesRet = "success";
}
}
catch (Exception ex)
{
funPMWOAutoCreate_FixedTimesRet = CombineFailMsg("0000-999999", ex.Message);
}
finally
{
// //釋放資源
if (dsTemp != null)
{
dsTemp.Dispose();
dsTemp = null;
}
//if (daTemp != null)
//{
// daTemp.Dispose();
// daTemp = null;
//}
colSQL = null;
colSQL_Rows = null;
// //Close Connection
CloseConnection(cnnTemp);
}
return funPMWOAutoCreate_FixedTimesRet;
}
private DataTable BuildMailTable()
{
DataTable BuildMailTableRet = default(DataTable);
var dtMail = new DataTable("SendMail");
dtMail.Columns.Add("WONo", typeof(string));
dtMail.Columns.Add("EquipmentNo", typeof(string));
dtMail.Columns.Add("EquipmentName", typeof(string));
dtMail.Columns.Add("EngineerGroupNo", typeof(string));
dtMail.Columns.Add("PMSOPName", typeof(string));
// SOPBasis
dtMail.Columns.Add("FrequencyName", typeof(string));
BuildMailTableRet = dtMail;
return BuildMailTableRet;
}
private string InitPMWONo()
{
string InitPMWONoRet = default(string);
// 傳入值: 無
// 傳回值: InitPMEQPSOPNo(成功),fail(失敗),
object SerialNo;
var cnnTemp = default(IDbConnection);
var intSerial = default(int);
var strMaxNo = default(string);
string strSQL;
try
{
// //Create connection
cnnTemp = CreateConnection(strConnectionString);
strSQL = "Select Max(WONo) From (select WONo from TBLPMWOBASIS union select WONo from TBLPMWOBASIS_HIS) A Where WONo like 'EW________'";
//cmmTemp = new IDbCommand(strSQL, cnnTemp);
SerialNo = ExecuteSQLQuery_Scalar(strSQL, cnnTemp);
if (SerialNo == null)
{
intSerial = 1;
}
else if (SerialNo is DBNull)
{
intSerial = 1;
}
else
{
strMaxNo = Conversions.ToString(SerialNo);
}
//cmmTemp.Dispose();
if (intSerial != 1)
{
// 取出序號
intSerial = Conversions.ToInteger(Strings.Mid(strMaxNo, 7, 4));
if (intSerial == 9999 || Conversions.ToInteger(Strings.Mid(strMaxNo, 5, 2)) != Thread.CurrentThread.CurrentCulture.Calendar.GetMonth(DateTime.Now))
{
intSerial = 1;
}
else
{
intSerial = intSerial + 1;
}
}
InitPMWONoRet = "EW" + Strings.Mid(Thread.CurrentThread.CurrentCulture.Calendar.GetYear(DateTime.Now).ToString(), 3, 2) + Strings.Format(Thread.CurrentThread.CurrentCulture.Calendar.GetMonth(DateTime.Now), "00") + Strings.Format(intSerial, "0000");
}
catch (Exception e1)
{
InitPMWONoRet = "fail";
throw;
} // New Exception("kcPM.InitPMWONo: " & e1.Message)
finally
{
CloseConnection(cnnTemp);
}
return InitPMWONoRet;
}
public string InitEQPSerialNo()
{
string InitEQPSerialNoRet = default(string);
// 傳入值: 無
// 傳回值: String(成功),fail(失敗)
// 2016-07-22, Joe, 調整原取EQPSerialNo的方式,改為日期+ThreadID
// 2017/10/25 OwenLiu, 調整取EQPSerialNo的方式,改為日期+ThreadID+亂數
// 編碼格式: [yyMMddHHmmssfff][ThreadId][nnn]
// yyMMddHHmmssfff : 取號當下的日期時間+3碼毫秒
// ThreadId : 執行序Id(2碼數字),自動補0
// nnn: 1~999 的隨機亂數(3碼數字),自動補0
string SerialNo;
short intUpperBound = 1; // 亂數的最小值
short intLowerBound = 999; // 亂數的最大值
short intRandomValue = 0;
var datEventTime = DateTime.Now;
InitEQPSerialNoRet = defString;
try
{
VBMath.Randomize();
intRandomValue = Convert.ToInt16(Math.Floor((intUpperBound - intLowerBound + 1) * VBMath.Rnd()) + intLowerBound);
// SerialNo = Format(Now, "yyMMddHHmmssfff") & Right(System.Threading.Thread.CurrentThread.ManagedThreadId.ToString, 3).PadLeft(3, "0") & "01"
SerialNo = datEventTime.ToString("yyMMddHHmmssfff");
SerialNo += Strings.Right(Thread.CurrentThread.ManagedThreadId.ToString(), 2).PadLeft(2, '0');
SerialNo += intRandomValue.ToString("000");
InitEQPSerialNoRet = SerialNo;
}
catch (Exception e1)
{
InitEQPSerialNoRet = "fail";
throw;
}
finally
{
}
return InitEQPSerialNoRet;
}
#endregion
#region ---自動下工排程作業---
private string funAutoClockOut(Collection colParameters = null)
{
string funAutoClockOutRet = default(string);
var CollectionSQL = new Collection();
string strSQL = string.Empty;
string strReturnMessage = ""; // 執行檔Catch訊息(Job Jog)。Chr(10)分隔每個錯誤訊息。
IDbConnection cn = null;
int intShiftCount = 0;
string[] strShiftName = new string[] { };
var strShiftSplit = default(string[]);
var strShiftInput = default(string);
var dbClockOutTime = default(double);
string argstrConnectionString = Conversions.ToString(ConnectionString);
try
{
cn = CreateConnection(argstrConnectionString);
string strTemp = "";
// Parameter01:班別
// Parameter02:自動下工時間
if (colParameters["Parameter01"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter01"]))))
{
}
else
{
strTemp = Strings.Trim(Conversions.ToString(colParameters["Parameter01"])).ToUpper();
strShiftInput = Convert.ToString(strTemp);
}
if (colParameters["Parameter02"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter02"]))))
{
}
else
{
strTemp = Strings.Trim(Conversions.ToString(colParameters["Parameter02"])).ToUpper();
if (modAutoRunLibrary.funChkNumericIsValid(pSourceText: strTemp, AllowMinus: false, AllowZeroValue: false, AllowFloat: true, AllowContainsDot: true))
{
if (Convert.ToDouble(strTemp) >= 0d)
{
dbClockOutTime = Convert.ToDouble(strTemp);
}
else
{
dbClockOutTime = 0.5d;
}
}
else
{
throw new Exception("Parameter02(ClockOutTime) is not valid Nnumeric data!");
}
}
// ------------------------------------------------
if (strShiftInput != "*")
{
strShiftSplit = strShiftInput.Split(',');
}
strSQL = "Select DISTINCT A.ShiftNo From tblUSRShiftBasis A " + " Where(to_char(sysdate,'HH24:MI:SS') < to_char(fromtime,'HH24:MI:SS') Or to_char(sysdate,'HH24:MI:SS') > to_char(totime+" + dbClockOutTime.ToString() + "/24,'HH24:MI:SS') and to_char(totime,'HH24:MI:SS')> to_char(fromtime,'HH24:MI:SS') ) " + " Or (to_char(sysdate,'HH24:MI:SS') < to_char(fromtime,'HH24:MI:SS') And to_char(sysdate,'HH24:MI:SS') > to_char(totime+" + dbClockOutTime.ToString() + "/24,'HH24:MI:SS') and to_char(totime,'HH24:MI:SS')< to_char(fromtime,'HH24:MI:SS') ) ";
string argDataBaseType = Conversions.ToString(DataBaseType);
//cmd.CommandText = SQLCommandTuning(argDataBaseType, ref strSQL);
using (var dr = ExecuteSQLQuery_Reader(SQLCommandTuning(argDataBaseType, ref strSQL), cn))
{
if (strShiftInput != "*")
{
while (dr.Read())
{
foreach (var objShiftNo in strShiftSplit)
{
if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(objShiftNo, dr["ShiftNo"].ToString(), false)))
{
Array.Resize(ref strShiftName, intShiftCount + 1);
strShiftName[intShiftCount] = dr["ShiftNo"].ToString();
intShiftCount += 1;
}
}
}
}
else
{
while (dr.Read())
{
Array.Resize(ref strShiftName, intShiftCount + 1);
strShiftName[intShiftCount] = dr["ShiftNo"].ToString();
intShiftCount += 1;
}
}
}
strSQL = " Select 1 As CheckFlag, A.* From tblWIPOperatorState A Where 1 = 1 ";
if (strShiftName.Length - 1 >= 0)
{
strSQL += " And A.ShiftNo = '" + strShiftName[0] + "' ";
intShiftCount += 1;
}
if (strShiftName.Length - 1 > 0)
{
var loopTo = strShiftName.Length - 1;
for (intShiftCount = 1; intShiftCount <= loopTo; intShiftCount++)
strSQL += " Or A.ShiftNo = '" + strShiftName[intShiftCount] + "' ";
}
string argDataBaseType1 = Conversions.ToString(DataBaseType);
//cmd.CommandText = SQLCommandTuning(argDataBaseType1, ref strSQL);
using (var dr = ExecuteSQLQuery_Reader(SQLCommandTuning(argDataBaseType1, ref strSQL), cn))
{
string argSendTime = Conversions.ToString(DateTime.Now);
strIdentity = CombineXMLIdentity(modWIN.gComputerName, modWIN.gUserNo, argSendTime);
while (dr.Read())
{
string argvalue_name = "userno";
string argname = "UserNo";
string argtype = "String";
string argvalue = CInput(dr["UserNo"].ToString());
string argdesc = "";
strParameter = CombineXMLParameter(argvalue_name, argname, argtype, argvalue, argdesc);
// 2018/01/04 OwenLiu, 登出時間改用介面上的時間(員工登入時的AP Server時間)
string argvalue_name1 = "logoutdate";
string argname1 = "LogoutDate";
string argtype1 = "Date";
string argvalue1 = Strings.Format(DateTime.Now, "yyyy/MM/dd HH:mm:ss");
string argdesc1 = "";
strParameter += CombineXMLParameter(argvalue_name1, argname1, argtype1, argvalue1, argdesc1);
// strParameter += CombineXMLParameter("logoutdate", "LogoutDate", "Date", Format(Now, "yyyy/MM/dd HH:mm:ss"), "")
string argvalue_name2 = "loginplaceno";
string argname2 = "LoginPlaceNo";
string argtype2 = "String";
string argvalue2 = CInput(dr["LoginPlaceNo"].ToString());
string argdesc2 = "";
strParameter += CombineXMLParameter(argvalue_name2, argname2, argtype2, argvalue2, argdesc2);
string argvalue_name3 = "multioperatormode";
string argname3 = "MultiOperatorMode";
string argtype3 = "Integer";
var tmp = dr;
string argvalue3 = Conversions.ToString(tmp["MultiOperatorMode"]);
string argdesc3 = "";
strParameter += CombineXMLParameter(argvalue_name3, argname3, argtype3, argvalue3, argdesc3);
InXml = CombineXMLRequest(strIdentity, strParameter);
OutXml = modAutoRunLibrary.InvokeSrv("wsWIP_OperatorState.ExecuteClockOut", InXml);
XmlDoc.LoadXml(OutXml);
}
}
ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, CollectionSQL);
}
catch (Exception ex)
{
// 錯誤訊息: 截取錯誤訊息+換行符號
if (!string.IsNullOrEmpty(strReturnMessage))
{
strReturnMessage += ControlChars.Cr + ex.Message;
}
else
{
strReturnMessage += ex.Message;
}
}
finally
{
CloseConnection(cn);
}
if (string.IsNullOrEmpty(strReturnMessage))
{
// //回傳Success
funAutoClockOutRet = "success";
}
else
{
// Message長度4000限制
if (strReturnMessage.Length > 3996)
strReturnMessage = strReturnMessage.Substring(0, 3996) + "...";
funAutoClockOutRet = CombineFailMsg("0000-999999", strReturnMessage);
}
return funAutoClockOutRet;
}
#endregion
#region GuardServer
private string funGuardServerSync(Collection colParameters = null)
{
string funGuardServerSyncRet = default(string);
string strReturnMessage = ""; // 執行檔Catch訊息(Job Jog)。Chr(10)分隔每個錯誤訊息。
string path;
try
{
path = modAutoRunLibrary.InvokeSrv_GuardServer();
var gsInfo = GuardServerProvider.Methods.GuardServerSchedule.ExecuteImplement(path);
if (gsInfo.Status != GuardServerProvider.Class.LicenseCode.OK && gsInfo.Status != GuardServerProvider.Class.LicenseCode.NotUseGuardServer)
{
strReturnMessage += gsInfo.Message;
}
}
catch (Exception ex)
{
if (!string.IsNullOrEmpty(strReturnMessage))
{
strReturnMessage += ControlChars.Cr + ex.Message;
}
else
{
strReturnMessage += ex.Message;
}
}
if (string.IsNullOrEmpty(strReturnMessage))
{
// //回傳Success
funGuardServerSyncRet = "success";
}
else
{
// Message長度4000限制
if (strReturnMessage.Length > 3996)
strReturnMessage = strReturnMessage.Substring(0, 3996) + "...";
funGuardServerSyncRet = CombineFailMsg("0000-999999", strReturnMessage);
}
return funGuardServerSyncRet;
}
#endregion
#region SDD201222_01 設備點檢支援可設定頻率
// 預開設備點檢單
// 1. 取出設備主檔(EP104)中已核准,且有設定點檢表的設備,依設備編號由小到大排序後,查核該設備當天是否需要預開點檢單。
// 2. 設備在執行查核是否要預開單前,需先將該設備在tblWIPEQPQCTask(生產設備檢驗任務表)中,狀態為1:已驗及2:待補檢的設備點檢單(Status in (1,2) and QCTaskClass=1)做刪除,(排除BelongDate=CurrentDate的)
// 但待補檢的設備點檢單,需在設備線上點檢歷程(tblWIPEQPQCListLog),新增一筆該設備點檢單的記錄,檢驗結果填 -1(tblWIPEQPQCListLog.QCResult = -1)。
// 3. 當該設備所設定的點檢頻率是,「每班檢」或「每日檢」時,才需要做預開單
// 4. 若該設備當天的點檢單,都已預先開立完成(tblWIPEQPQCTask內已有當天該設備點檢頻率的點檢單),則當天就不需再開立,也就是每種點檢頻率,一天只需預開一張點檢單。
// 5. 點檢頻率是「每班檢」時,依該設備所屬區域對應的部門,查出該部門的所有的班別,每一個班別就預開一張設備點檢單。
// 6. 點檢頻率是「每日檢」時,依所設定每日檢的起始時間,預開一張設備點檢單。
// 7. 預先開立的設備點檢單,檢驗任務編號,請比照取得 EQPSerialNo的方式(以 GUID 的方式)取得,
// 檢驗任務分類是設備點檢,狀態是未驗(Status=0),並需壓上預計執行時間,寫入tabletblWIPEQPQCTask(生產設備檢驗任務表)。
// 8. 預開點檢單的預計執行時間,就是該點檢單的點檢頻率時間+當天的日期,
// 每班檢的點檢單預計執行時間,就以該點檢單是哪個班別(早班或午班或晚班)的點檢單,以那個班別的起始時間為預計執行時間,
// 而每日檢的點檢單預計執行時間,則是以該點檢單是,每日的哪個起始時間的點檢單,以該頻率的起始時間為預計執行時間
// 9. 預開點檢單的歸屬日,填入開單當天的日期。
// 10.不需將所有設備的預開單處理,都包在同一個交易一起寫入資料庫內,一台設備做完,就寫入資料庫內。
// 11. 建議此 Job 基本是每天只執行一次,最好是在當天的 00:00 時開始執行,才符合預開設備點檢單的作用。
private string funPreCreateEQPQCList(Collection colParameters = null)
{
string funPreCreateEQPQCListRet = default(string);
var cnnTemp = default(IDbConnection);
DbDataReader drTemp;
string strSQL;
//System.Data.OleDb.OleDbDataAdapter daTemp;
string strSQLAddField;
string strSQLAddValue;
var CollectionSQL = new Collection();
var aryDeleteList = new ArrayList();
DataTable dtEQPQCListSetup = new DataTable(), dtQCTack = new DataTable(), dtShift = new DataTable();
var datCurrentDate = DateTime.Now;
DataRow[] drSel;
DataRow drAdd;
string strQCTaskNo = "";
string strPlanQCTime = "";
try
{
cnnTemp = CreateConnection(strConnectionString);
// 1. 取得各設備的設備點檢卡控設定資料
strSQL = "SELECT A.*,B.QCListNo FROM tblEQPQCListSetup A " + " JOIN tblEQPEquipmentBasis B ON A.EquipmentNo = B.EquipmentNo " + " WHERE B.IssueState = 2 Order By A.EquipmentNo ";
//cmmTemp = new IDbCommand(strSQL, cnnTemp);
//daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp);
//daTemp.Fill(dtEQPQCListSetup);
//daTemp.Dispose();
//cmmTemp.Dispose();
ExecuteSQLQuery_Adapter(strSQL, dtEQPQCListSetup, cnnTemp);
// 2.刪除歸屬日不是今天的資料,並備份其中待補檢的資料到Log表中
foreach (DataRow rL in dtEQPQCListSetup.Rows)
{
// 2.1 每次執行前都清空集合
CollectionSQL.Clear();
// 2.2 取得各設備的設備點檢卡控設定資料
strSQL = Conversions.ToString("SELECT * FROM tblWIPEQPQCTask " + " Where Status In (0,1,2) And InspType In (1,2) And QCTaskClass = 1 And EquipmentNo = '" +
rL["EquipmentNo"] + "' ");
//cmmTemp = new IDbCommand(strSQL, cnnTemp);
//daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp);
if (!(dtQCTack == null))
dtQCTack.Clear();
//daTemp.Fill(dtQCTack);
//daTemp.Dispose();
//cmmTemp.Dispose();
ExecuteSQLQuery_Adapter(strSQL, dtQCTack, cnnTemp);
foreach (DataRow rQT in dtQCTack.Rows)
{
// 2.3 找出歸屬日不是當日的現況資料
if ((Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(rQT["Status"], 1, false)) || Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(rQT["Status"], 2, false))) && (Strings.Format(Conversions.ToDate(rQT["BelongDate"]), "yyyy/MM/dd") ?? "") != (Strings.Format(Conversions.ToDate(datCurrentDate), "yyyy/MM/dd") ?? ""))
{
// 2.3.1 將現況表上已驗與待補驗,並且BelongDate(歸屬日)不是當日的資料刪除
if (!aryDeleteList.Contains(rL["EquipmentNo"])) // 避免多次執行同樣的SCRIPT
{
strSQL = Conversions.ToString(" Delete From tblWIPEQPQCTask Where BelongDate <> To_Date('" + Strings.Format(Conversions.ToDate(datCurrentDate), "yyyy/MM/dd") + "','yyyy/MM/dd') " + " And Status In (1,2) And InspType In (1,2) And QCTaskClass = 1 And EquipmentNo = '" +
rL["EquipmentNo"] + "' ");
CollectionSQL.Add(strSQL);
aryDeleteList.Add(rL["EquipmentNo"]);
}
// 2.3.2 將待補檢的檢驗單備份到Log表內,QCResult = -1,QCTaskStatus=2
if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(rQT["Status"], 2, false)))
{
strSQLAddField = " Insert Into tblWIPEQPQCListLog (QCTaskNo,QCListSerial,EquipmentNo,QCListNo,QCResult,QCTaskStatus ";
strSQLAddValue = Conversions.ToString(" Values ('" +
rQT["QCTaskNo"] + "','" + rQT["QCTaskNo"] + "','" + rL["EquipmentNo"] + "','" + rQT["QCNo"] + "',-1,2 ");
if (!string.IsNullOrEmpty(rQT["InspType"].ToString()))
{
strSQLAddField = strSQLAddField + ",InspType";
strSQLAddValue = Conversions.ToString(strSQLAddValue + "," + rQT["InspType"] + " ");
}
if (!string.IsNullOrEmpty(rQT["ShiftNo"].ToString()))
{
strSQLAddField = strSQLAddField + ",ShiftNo";
strSQLAddValue = Conversions.ToString(strSQLAddValue + ",'" + rQT["ShiftNo"] + "' ");
}
if (!string.IsNullOrEmpty(rQT["LotNo"].ToString()))
{
strSQLAddField = strSQLAddField + ",LotNo";
strSQLAddValue = Conversions.ToString(strSQLAddValue + ",'" + rQT["LotNo"] + "' ");
}
if (!string.IsNullOrEmpty(rQT["InspStartTime"].ToString()))
{
strSQLAddField = strSQLAddField + ",InspStartTime ";
strSQLAddValue = strSQLAddValue + ", To_Date('" + Strings.Format(Conversions.ToDate(rQT["InspStartTime"]), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')";
}
if (Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(rQT["BelongDate"], defDateTime, false)))
{
strSQLAddField = strSQLAddField + ",BelongDate ";
strSQLAddValue = strSQLAddValue + ", To_Date('" + Strings.Format(Conversions.ToDate(rQT["BelongDate"]), "yyyy/MM/dd") + "','YYYY/MM/DD')";
}
if (!string.IsNullOrEmpty(rQT["PlanQCTime"].ToString()))
{
strSQLAddField = strSQLAddField + ",PlanQCTime ";
strSQLAddValue = strSQLAddValue + ", To_Date('" + Strings.Format(Conversions.ToDate(rQT["PlanQCTime"]), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')";
}
strSQLAddField = strSQLAddField + ",Creator ";
strSQLAddValue = strSQLAddValue + ",'AutoRun' ";
strSQLAddField = strSQLAddField + ",CreateDate ";
strSQLAddValue = strSQLAddValue + ", To_Date('" + Strings.Format(Conversions.ToDate(datCurrentDate), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')";
strSQL = strSQLAddField + ")" + strSQLAddValue + ")";
CollectionSQL.Add(strSQL);
}
}
}
// 3. 「每班檢」或「每日檢」時,才需要做預開單(並且當天尚未存在檢驗單)
string InspTypeTmp = rL["InspType"].ToString();
switch (InspTypeTmp)
{
// 3.1 每班檢
case "1":
{
// 3.1.1 找出該設備的班別
// 97012: 湖北台基设备做每班检找班别时,设备群组内的设备无法进行班别查找,请调整为可以支持设备群组内的设备做每班点检时可寻找到班别
// Edison 2021/07/29調整找班別的語法,加入設備群組的班別
strSQL = " Select * From tblUSRSHIFTBASIS Where IssueState = 2 And DEPARTMENTNO = ( " +
" Select DepartmentNo From tblSMDAreaBasis " +
" Where IssueState = 2 And AREANO = (Select ContainAreaNo From tblSMDAreaRelation Where ObjectNo = '" +
rL["EquipmentNo"] + "')) " + " UNION " +
" Select * From tblUSRSHIFTBASIS Where IssueState = 2 And DEPARTMENTNO = ( " +
" Select DepartmentNo From tblSMDAreaBasis " +
" Where IssueState = 2 And AREANO = (Select ContainAreaNo From tblSMDAreaRelation Where ObjectNo = " +
" (SELECT EQUIPMENTGROUP FROM TBLEQPGROUPDETAIL WHERE EQUIPMENTNO='" + rL["EquipmentNo"] + "' ) )) ";
//cmmTemp = new IDbCommand(strSQL, cnnTemp);
//daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp);
if (!(dtShift == null))
dtShift.Clear();
//daTemp.Fill(dtShift);
//daTemp.Dispose();
//cmmTemp.Dispose();
ExecuteSQLQuery_Adapter(strSQL, dtShift, cnnTemp);
foreach (DataRow rS in dtShift.Rows)
{
// 3.1.2 若現狀況表中該設備當天不存在此班別檢驗單,則新增一筆
drSel = dtQCTack.Select(Conversions.ToString(" InspType = " +
rL["InspType"] + " And BelongDate = #" + Strings.Format(Conversions.ToDate(datCurrentDate), "yyyy/MM/dd") + "# And ShiftNo = '" +
rS["ShiftNo"] + "' And Status = 0 "));
if (drSel.Length == 0)
{
strQCTaskNo = InitEQPSerialNoByGuid();
strSQLAddField = " Insert Into tblWIPEQPQCTask (QCTASKNO, EQUIPMENTNO, QCTASKCLASS, INSPTYPE, QCNO ";
strSQLAddValue = Conversions.ToString(" Values ('" + strQCTaskNo + "','" +
rL["EquipmentNo"] + "',1,1,'" + rL["QCListNo"] + "' ");
strSQLAddField = strSQLAddField + ",ShiftNo";
strSQLAddValue = Conversions.ToString(strSQLAddValue + ",'" + rS["ShiftNo"] + "' ");
strSQLAddField = strSQLAddField + ",BelongDate ";
strSQLAddValue = strSQLAddValue + ", To_Date('" + Strings.Format(Conversions.ToDate(datCurrentDate), "yyyy/MM/dd") + "','YYYY/MM/DD')";
strSQLAddField = strSQLAddField + ",CreateDate ";
strSQLAddValue = strSQLAddValue + ", To_Date('" + Strings.Format(Conversions.ToDate(datCurrentDate), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')";
strPlanQCTime = Strings.Format(Conversions.ToDate(datCurrentDate), "yyyy/MM/dd") + " " + Strings.Format(Conversions.ToDate(rS["FromTime"]), "H:mm:ss");
strSQLAddField = strSQLAddField + ",PlanQCTime ";
strSQLAddValue = strSQLAddValue + ", To_Date('" + Strings.Format(Conversions.ToDate(strPlanQCTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')";
strSQL = strSQLAddField + ")" + strSQLAddValue + ")";
CollectionSQL.Add(strSQL);
}
}
break;
}
// 3.2 每日檢
case "2":
{
// 3.2.2 若現狀況表中該設備當天不存在每日檢檢驗單,則新增一筆
drSel = dtQCTack.Select(Conversions.ToString(" InspType = " +
rL["InspType"] + " And BelongDate = #" + Strings.Format(Conversions.ToDate(datCurrentDate), "yyyy/MM/dd") + "# And Status = 0"));
if (drSel.Length == 0)
{
strQCTaskNo = InitEQPSerialNoByGuid();
strSQLAddField = " Insert Into tblWIPEQPQCTask (QCTASKNO, EQUIPMENTNO, QCTASKCLASS, INSPTYPE, QCNO ";
strSQLAddValue = Conversions.ToString(" Values ('" + strQCTaskNo + "','" +
rL["EquipmentNo"] + "',1,2,'" + rL["QCListNo"] + "' ");
strSQLAddField = strSQLAddField + ",InspStartTime";
strSQLAddValue = Conversions.ToString(strSQLAddValue + ",'" + rL["InspStartTime"] + "' ");
strSQLAddField = strSQLAddField + ",BelongDate ";
strSQLAddValue = strSQLAddValue + ", To_Date('" + Strings.Format(Conversions.ToDate(datCurrentDate), "yyyy/MM/dd") + "','YYYY/MM/DD')";
strSQLAddField = strSQLAddField + ",CreateDate ";
strSQLAddValue = strSQLAddValue + ", To_Date('" + Strings.Format(Conversions.ToDate(datCurrentDate), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')";
strPlanQCTime = Conversions.ToString(Strings.Format(Conversions.ToDate(datCurrentDate), "yyyy/MM/dd") + " " +
rL["InspStartTime"]);
strSQLAddField = strSQLAddField + ",PlanQCTime ";
strSQLAddValue = strSQLAddValue + ", To_Date('" + Strings.Format(Conversions.ToDate(strPlanQCTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')";
strSQL = strSQLAddField + ")" + strSQLAddValue + ")";
CollectionSQL.Add(strSQL);
}
break;
}
}
if (CollectionSQL.Count > 0)
{
ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, CollectionSQL);
}
}
funPreCreateEQPQCListRet = "success";
}
catch (Exception ex)
{
funPreCreateEQPQCListRet = CombineFailMsg("0000-999999", ex.Message);
colParameters.Add(funPreCreateEQPQCListRet, "EmailBody");
SendJobFailEmail(colParameters);
}
finally
{
if (!(dtEQPQCListSetup == null))
dtEQPQCListSetup.Dispose();
if (!(dtQCTack == null))
dtQCTack.Dispose();
if (!(dtShift == null))
dtShift.Dispose();
CloseConnection(cnnTemp);
}
return funPreCreateEQPQCListRet;
}
// 待補檢設備點檢單通知
// 1. 參數一,是設定補檢有效時間,單位為小時,可以設定小數;當目前時間-檢驗任務的預計執行時間< 補檢有效時間時,就視為需做通知,所以是在准許時間內的待補檢單才需通知。
// 2. 取出生產設備檢驗任務表(tblWIPEQPQCTask)中,檢驗任務狀態為待補檢的設備點檢單(Status=2 and QCTaskClass=1),
// 並檢查每筆待補檢的檢驗任務,是否還在有效的補檢時間內,若是,則此筆的待補檢的檢驗任務需做 mail 通知該設備的工程管理群組人員
// 3. 有效的待補檢檢驗任務的判別方式,是以目前時間減檢驗任務的預計執行時間後,相減後的時間小於參數一所設定的有效時間(小時)
// (目前時間-檢驗任務的預計執行時間(分鐘) < 補檢有效時間(分鐘) = 有效的待補檢點檢單),時間的計算都以分鐘來做計算及判定
// 4. 若有有效的時間內的補檢設備點檢單,則依該點檢單的設備編號,找出所屬的工程管理群組,並mail給該管理群組內的人員。
// 5. Mail 的發送以工程管理群組為主,把工程管理群組所要列管的設備下,所有的有效補檢的點檢單,彙整成一封mail 寄出。
private string funAlertAfterEventEQPQCList(Collection colParameters = null)
{
string funAlertAfterEventEQPQCListRet = default(string);
var cnnTemp = default(IDbConnection);
//System.Data.OleDb.OleDbDataAdapter daTemp;
string strSQL;
var CollectionSQL = new Collection();
DataTable dtQCTack = new DataTable(), dtMail = new DataTable();
var datCurrentDate = DateTime.Now;
DataRow[] drSel, drSelM;
double dblEffectiveTime = 0d;
double dblMinDiff = 0d;
string strMailBody = "";
System.Windows.Forms.SystemInformation WinFormInfo;
modWIN.gComputerName = System.Windows.Forms.SystemInformation.ComputerName;
do
{
try
{
// ParameterXX參數說明
// 01 補檢有效時間
// Parameter01為傳入參數, 作為補檢有效時間, 若無此值則不進行下面的程式
if (colParameters["Parameter01"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter01"]))))
{
funAlertAfterEventEQPQCListRet = CombineFailMsg("0000-200002", "After Event Effective Time not found!!!(Parameter 01)");
break;
}
else if (Information.IsNumeric(colParameters["Parameter01"]))
{
dblEffectiveTime = Conversions.ToDouble(Strings.Trim(Conversions.ToString(colParameters["Parameter01"])));
}
else
{
funAlertAfterEventEQPQCListRet = CombineFailMsg("0000-200011", "After Event Effective Time not Numeric!!!(Parameter 01)");
break;
}
cnnTemp = CreateConnection(strConnectionString);
// 1. 取得各設備的設備點檢卡控設定資料
strSQL = " SELECT A.*,B.EngineerGroupNo,B.EquipmentName,C.ShiftName FROM tblWIPEQPQCTask A " + " Join tblEQPEquipmentBasis B ON A.EquipmentNo = B.EquipmentNo " + " Left Join tblUSRShiftBasis C ON A.SHIFTNO = C.SHIFTNO " + " Where a.Status =2 And QCTaskClass=1 Order By InspType,PlanQCTime";
//cmmTemp = new IDbCommand(strSQL, cnnTemp);
//daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp);
//daTemp.Fill(dtQCTack);
//daTemp.Dispose();
//cmmTemp.Dispose();
ExecuteSQLQuery_Adapter(strSQL, dtQCTack, cnnTemp);
// 2. 查核每筆待補檢資料是否符合發送mail標準 (當目前時間-檢驗任務的預計執行時間< 補檢有效時間)
// 新增是否繼送Mail的查核欄位
dtQCTack.Columns.Add("SendMail", Type.GetType("System.String"));
foreach (DataRow rQT in dtQCTack.Rows)
{
dblMinDiff = DateAndTime.DateDiff("n", Conversions.ToDate(rQT["PlanQCTime"]), Conversions.ToDate(datCurrentDate));
if (dblMinDiff < dblEffectiveTime * 60d)
{
rQT["SendMail"] = "Y";
}
else
{
rQT["SendMail"] = "N";
}
}
// 3.依據設備工成群組組成發送Mail內容Table
dtMail.Columns.Add("EngineerGroupNo", Type.GetType("System.String"));
dtMail.Columns.Add("MailBody", Type.GetType("System.String"));
dtMail.Columns.Add("EquipmentNo", Type.GetType("System.String"));
string FileName = defString;
foreach (DataRow rM in dtQCTack.DefaultView.ToTable(true, "EngineerGroupNo").Rows)
{
drSel = dtQCTack.Select(Conversions.ToString("EngineerGroupNo = '" + rM["EngineerGroupNo"] + "' And SendMail ='Y' "));
if (drSel.Length > 0)
{
foreach (DataRow rMB in drSel)
{
string InspTypeTmp = rMB["InspType"].ToString();
switch (InspTypeTmp)
{
case "0":
{
strMailBody = Conversions.ToString(Constants.vbCrLf + "       - " + TranslateMsg("[%LOTINSPECTION%]", strLanguageMode, strResourceDir) + " : " +
rMB["LotNo"] + " / " + TranslateMsg("[%QCLISTNO%]", strLanguageMode, strResourceDir) + " : " + rMB["QCNo"]);
break;
}
case "1":
{
strMailBody = Conversions.ToString(Constants.vbCrLf + "       - " + TranslateMsg("[%SHIFTINSPECTION%]", strLanguageMode, strResourceDir) + " : " +
rMB["ShiftName"] + " / " + TranslateMsg("[%QCLISTNO%]", strLanguageMode, strResourceDir) + " : " + rMB["QCNo"]);
break;
}
case "2":
{
strMailBody = Conversions.ToString(Constants.vbCrLf + "       - " + TranslateMsg("[%DAILYINSPECTION%]", strLanguageMode, strResourceDir) + "   " +
rMB["InspStartTime"] + " / " + TranslateMsg("[%QCLISTNO%]", strLanguageMode, strResourceDir) + " : " + rMB["QCNo"]);
break;
}
}
drSelM = dtMail.Select(Conversions.ToString(" EquipmentNo = '" + rMB["EquipmentNo"] + "' "));
if (drSelM.Length == 0)
{
var drAdd = dtMail.NewRow();
drAdd["EngineerGroupNo"] = rMB["EngineerGroupNo"];
drAdd["EquipmentNo"] = rMB["EquipmentNo"];
drAdd["MailBody"] = Constants.vbCrLf + "    " + rMB["EquipmentNo"] + " / " + rMB["EquipmentName"] + strMailBody;
dtMail.Rows.Add(drAdd);
}
else
{
drSelM[0]["MailBody"] = drSelM[0]["MailBody"] + strMailBody;
}
}
}
// 4. 發送Mail
drSelM = dtMail.Select(Conversions.ToString(" EngineerGroupNo = '" + rM["EngineerGroupNo"] + "' "));
if (drSelM.Length > 0)
{
strMailBody = " Dear Receiver, " + Constants.vbCrLf + Constants.vbCrLf + "    " + TranslateMsg("[%EquipmenListedBelowstillhadAlterEventPleaseCheckit%]", strLanguageMode, strResourceDir);
foreach (DataRow rSM in drSelM)
strMailBody = Conversions.ToString(strMailBody + Constants.vbCrLf + rSM["MailBody"]);
string argEmailSubject = TranslateMsg("[%EuipmentInspectionAlterEventMailSubject%]", strLanguageMode, strResourceDir);
string argEmailBody = CInput(strMailBody);
modAutoRunLibrary.SendMultiEmail(ref FileName, ref argEmailSubject, argEmailBody, Conversions.ToString(rM["EngineerGroupNo"]), GroupType: (modAutoRunLibrary.GroupType)Conversions.ToInteger("2"));
}
}
funAlertAfterEventEQPQCListRet = "success";
}
catch (Exception ex)
{
funAlertAfterEventEQPQCListRet = CombineFailMsg("0000-999999", ex.Message);
colParameters.Add(funAlertAfterEventEQPQCListRet, "EmailBody");
SendJobFailEmail(colParameters);
}
finally
{
if (!(dtQCTack == null))
dtQCTack.Dispose();
CloseConnection(cnnTemp);
}
}
while (false);
return funAlertAfterEventEQPQCListRet;
}
public string InitEQPSerialNoByGuid()
{
string InitEQPSerialNoByGuidRet = default(string);
// 傳入值: 無
// 傳回值: String(成功),fail(失敗)
// 2016-07-22, Joe, 調整原取EQPSerialNo的方式,改為日期+ThreadID
// 2017/10/25 OwenLiu, 調整取EQPSerialNo的方式,改為日期+ThreadID+亂數
// 編碼格式: [yyMMddHHmmssfff][ThreadId][nnn]
// yyMMddHHmmssfff : 取號當下的日期時間+3碼毫秒
// ThreadId : 執行序Id(2碼數字),自動補0
// nnn: 1~999 的隨機亂數(3碼數字),自動補0
// 2020/02/24 OwenLiu, Mantis:0067661, 調整EQPSerial 的編碼規則
// 每次產生新的GUID再用Base64編碼成字串,在隨機在編碼後的字串固定範圍(2~10字元位置)內加入3碼亂數(自動補0)
string SerialNo;
short intUpperBound = 999; // 亂數的最大值
short intLowerBound = 1; // 亂數的最小值
short intStartBound = 2; // 亂數的最小值
short intEndBound = 10; // 亂數的最大值
short intRandomValue = 0;
short intRandomPosition = 0;
var datEventTime = DateTime.Now;
InitEQPSerialNoByGuidRet = defString;
try
{
VBMath.Randomize();
intRandomValue = Convert.ToInt16(Math.Floor((intUpperBound - intLowerBound + 1) * VBMath.Rnd()) + intLowerBound);
intRandomPosition = Convert.ToInt16(Math.Floor((intStartBound - intEndBound + 1) * VBMath.Rnd()) + intEndBound);
string strEQPGuid = Convert.ToBase64String(Guid.NewGuid().ToByteArray());
SerialNo = strEQPGuid.Substring(0, intRandomPosition) + intRandomValue.ToString("000") + strEQPGuid.Substring(intRandomPosition);
InitEQPSerialNoByGuidRet = SerialNo;
}
catch (Exception e1)
{
InitEQPSerialNoByGuidRet = "fail";
throw;
}
finally
{
}
return InitEQPSerialNoByGuidRet;
}
#endregion
#region OGSM 駕駛艙
private string CombineFailMsg(string ErrorCode, string Description)
{
string CombineFailMsgRet = default(string);
CombineFailMsgRet = "fail;" + ErrorCode + ";" + Description;
return CombineFailMsgRet;
}
///
/// 解析ErrorLog的Description之ErrorCode,回填ErrorCode與ErrorType(舊資料)
///
///
/// 已執行到的時間記錄於Parameter10
///
///
/// 每次取3天份的資料,每次取還未執行的舊資料(3/8~3/10 => 3/5~3/7 => 3/2~3/4)
/// 今天為2022/3/29,若Parameter10欄位沒有值, 則取得2022/3/27~2022/3/29 結束後將2022/3/26回填Parameter10
/// 今天為2022/3/29,若Parameter10欄位有值(2022/3/27), 則取得2022/3/25~2022/3/27 結束後將2022/3/24回填Parameter10
///
private string funParseErrorLogErrorCodePast(Collection colParameters = null)
{
string funParseErrorLogErrorCodePastRet = default(string);
string strReturnMessage = ""; // 執行檔Catch訊息(Job Jog)。Chr(10)分隔每個錯誤訊息。
try
{
if (colParameters["JobNo"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["JobNo"]))))
{
funParseErrorLogErrorCodePastRet = CombineFailMsg("0000-999999", "There is no JobNo!");
return funParseErrorLogErrorCodePastRet;
}
DateTime startDate, endDate;
// 已執行到的時間記錄於Parameter10
if (colParameters["Parameter10"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter10"]))))
{
endDate = DateTime.Now;
startDate = endDate.AddDays(-2);
}
else
{
endDate = DateTime.Parse(Conversions.ToString(colParameters["Parameter10"]));
startDate = endDate.AddDays(-2);
}
var dtTemp = new DataTable();
dtTemp = GetErrorLog(startDate, endDate);
// 表示時段中的ErrorCode都有填上
if (dtTemp.Rows.Count <= 0)
{
Collection argCollectionSQL = null;
UpdateParameter10(startDate.AddDays(-1), Conversions.ToString(colParameters["JobNo"]), CollectionSQL: argCollectionSQL);
funParseErrorLogErrorCodePastRet = "success";
return funParseErrorLogErrorCodePastRet;
}
// 填上ErrorCode, ErrorType
FillInErrorCodeAndErrorType(dtTemp);
// update ErrorCode, ErrorType
var CollectionSQL = new Collection();
UpdateErrorCodeAndErrorType(dtTemp, ref CollectionSQL);
UpdateParameter10(startDate.AddDays(-1), Conversions.ToString(colParameters["JobNo"]), CollectionSQL);
ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, CollectionSQL);
}
catch (Exception ex)
{
// 錯誤訊息: 截取錯誤訊息+換行符號
if (!string.IsNullOrEmpty(strReturnMessage))
{
strReturnMessage += ControlChars.Cr + ex.Message;
}
else
{
strReturnMessage += ex.Message;
}
}
if (string.IsNullOrEmpty(strReturnMessage))
{
// //回傳Success
funParseErrorLogErrorCodePastRet = "success";
}
else
{
// Message長度4000限制
if (strReturnMessage.Length > 3996)
strReturnMessage = strReturnMessage.Substring(0, 3996) + "...";
funParseErrorLogErrorCodePastRet = CombineFailMsg("0000-999999", strReturnMessage);
}
return funParseErrorLogErrorCodePastRet;
}
private DataTable GetErrorLog(DateTime startDate, DateTime endDate)
{
var sb = new StringBuilder();
sb.Append("select userid, recorddate, servicename, DESCRIPTION, errorcode, errorType from tblsyserrorlog ");
sb.Append("where ");
sb.AppendFormat("recorddate >= to_date('{0}','YYYY/MM/DD HH24:MI:SS') and ", Strings.Format(startDate, "yyyy/MM/dd 00:00:00"));
sb.AppendFormat("recorddate <= to_date('{0}','YYYY/MM/DD HH24:MI:SS') and ", Strings.Format(endDate, "yyyy/MM/dd 23:59:59"));
sb.Append("(errorcode is null or errorcode = '')");
string strSQL = sb.ToString();
var dtTemp = new DataTable();
var dsTemp = new DataSet();
var cnnTemp = default(IDbConnection);
//System.Data.OleDb.OleDbDataAdapter daTemp;
try
{
cnnTemp = CreateConnection(strConnectionString);
//cmmTemp = new IDbCommand(strSQL, (IDbConnection)cnnTemp);
//daTemp = new System.Data.OleDb.OleDbDataAdapter((IDbCommand)cmmTemp);
//daTemp.Fill(dsTemp, "errorLog");
ExecuteSQLQuery_Adapter(strSQL, dsTemp, "errorLog", cnnTemp);
dtTemp = dsTemp.Tables[0];
}
catch (Exception)
{
throw;
}
finally
{
CloseConnection(cnnTemp);
}
return dtTemp;
}
private void FillInErrorCodeAndErrorType(DataTable dtTemp)
{
foreach (DataRow dr in dtTemp.Rows)
{
string description = dr["DESCRIPTION"].ToString();
if (!description.Contains(""))
{
dr["ERRORCODE"] = "0000-999999";
dr["ERRORTYPE"] = 2;
continue;
}
// 讀取InXml字串
XmlDoc.LoadXml("" + description + "");
dr["ERRORCODE"] = XmlDoc.DocumentElement.GetElementsByTagName("code").Item(0).InnerText;
dr["ERRORTYPE"] = dr["ERRORCODE"].ToString() == "0000-999999" ? 2 : 1;
}
}
private void UpdateErrorCodeAndErrorType(DataTable dtTemp, ref Collection CollectionSQL)
{
CollectionSQL = new Collection();
string errorCode, errorType;
string userid, serviceName;
var sb = new StringBuilder();
string strSQL;
foreach (DataRow dr in dtTemp.Rows)
{
errorCode = dr["ERRORCODE"].ToString();
errorType = dr["ERRORTYPE"].ToString();
userid = dr["USERID"].ToString();
serviceName = dr["SERVICENAME"].ToString();
sb.Clear();
sb.AppendFormat("update tblsyserrorlog set errorcode = '{0}', errortype = '{1}' ", errorCode, errorType);
sb.AppendFormat("where userid = '{0}' and ", userid);
sb.AppendFormat("recorddate = to_date('{0}','YYYY/MM/DD HH24:MI:SS') and ", Strings.Format(dr["RECORDDATE"], "yyyy/MM/dd HH:mm:ss"));
sb.AppendFormat("servicename = '{0}'", serviceName);
strSQL = sb.ToString();
CollectionSQL.Add(strSQL);
}
}
private void UpdateParameter10(DateTime nextParameter10, string jobNo, Collection CollectionSQL = null)
{
var sb = new StringBuilder();
sb.AppendFormat("update tblMESAutoRunJob set parameter10 = '{0}' where jobno = '{1}'", Strings.Format(nextParameter10, "yyyy/MM/dd"), jobNo);
string strSQL = sb.ToString();
if (CollectionSQL != null)
{
CollectionSQL.Add(strSQL);
return;
}
CollectionSQL = new Collection();
CollectionSQL.Add(strSQL);
ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, CollectionSQL);
}
///
/// 解析ErrorLog的Description之ErrorCode,回填ErrorCode與ErrorType(新資料)
///
///
/// 已執行到的時間記錄於Parameter09
///
///
/// 每次取3天份的資料,每次取還未執行的新資料(3/8~3/10 => 3/11~3/13 => 3/14~3/16)
/// 今天為2022/3/29,若Parameter09欄位沒有值, 則取得現時點往回3天份的資料(2022/3/27~2022/3/29) 結束後將2022/3/29回填Parameter09
/// 今天為2022/3/29,若Parameter09欄位有值且差距大於2天(2022/3/25), 則取得2022/3/25~2022/3/27 結束後將2022/3/28回填Parameter09
/// 今天為2022/3/29,若Parameter09欄位有值且差距小於2天(2022/3/27), 則取得2022/3/27~2022/3/29 結束後將2022/3/29回填Parameter09
///
private string funParseErrorLogErrorCodeForward(Collection colParameters = null)
{
string funParseErrorLogErrorCodeForwardRet = default(string);
string strReturnMessage = ""; // 執行檔Catch訊息(Job Jog)。Chr(10)分隔每個錯誤訊息。
try
{
if (colParameters["JobNo"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["JobNo"]))))
{
funParseErrorLogErrorCodeForwardRet = CombineFailMsg("0000-999999", "There is no JobNo!");
return funParseErrorLogErrorCodeForwardRet;
}
// 已執行到的時間記錄於Parameter10
DateTime startDate, endDate, nextParameter10;
endDate = GetEndDate(Conversions.ToString(colParameters["Parameter10"]));
startDate = GetStartDate(Conversions.ToString(colParameters["Parameter10"]));
nextParameter10 = GetNextParameter10(Conversions.ToString(colParameters["Parameter10"]));
var dtTemp = new DataTable();
dtTemp = GetErrorLog(startDate, endDate);
// 表示時段中的ErrorCode都有填上
if (dtTemp.Rows.Count <= 0)
{
Collection argCollectionSQL = null;
UpdateParameter10(nextParameter10, Conversions.ToString(colParameters["JobNo"]), CollectionSQL: argCollectionSQL);
funParseErrorLogErrorCodeForwardRet = "success";
return funParseErrorLogErrorCodeForwardRet;
}
// 填上ErrorCode, ErrorType
FillInErrorCodeAndErrorType(dtTemp);
// update ErrorCode, ErrorType
var CollectionSQL = new Collection();
UpdateErrorCodeAndErrorType(dtTemp, ref CollectionSQL);
UpdateParameter10(nextParameter10, Conversions.ToString(colParameters["JobNo"]), CollectionSQL);
ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, CollectionSQL);
}
catch (Exception ex)
{
// 錯誤訊息: 截取錯誤訊息+換行符號
if (!string.IsNullOrEmpty(strReturnMessage))
{
strReturnMessage += ControlChars.Cr + ex.Message;
}
else
{
strReturnMessage += ex.Message;
}
}
if (string.IsNullOrEmpty(strReturnMessage))
{
// //回傳Success
funParseErrorLogErrorCodeForwardRet = "success";
}
else
{
// Message長度4000限制
if (strReturnMessage.Length > 3996)
strReturnMessage = strReturnMessage.Substring(0, 3996) + "...";
funParseErrorLogErrorCodeForwardRet = CombineFailMsg("0000-999999", strReturnMessage);
}
return funParseErrorLogErrorCodeForwardRet;
}
private DateTime GetStartDate(string parameter10)
{
if (parameter10 == null || string.IsNullOrEmpty(Strings.Trim(parameter10)))
{
return DateTime.Now.AddDays(-2);
}
else
{
return DateTime.Parse(parameter10);
}
}
private DateTime GetEndDate(string parameter10)
{
if (parameter10 == null || string.IsNullOrEmpty(Strings.Trim(parameter10)))
{
return DateTime.Now;
}
var tempDate = DateTime.Parse(parameter10);
if (DateTime.Today.CompareTo(tempDate.AddDays(+2)) <= 0)
{
return DateTime.Today;
}
else
{
return tempDate.AddDays(+2);
}
}
private DateTime GetNextParameter10(string parameter10)
{
if (parameter10 == null || string.IsNullOrEmpty(Strings.Trim(parameter10)))
{
return DateTime.Now;
}
var tempDate = DateTime.Parse(parameter10);
if (DateTime.Today.CompareTo(tempDate.AddDays(+2)) <= 0)
{
return DateTime.Today;
}
else
{
return tempDate.AddDays(+3);
}
}
#endregion
#region MES與WF與PLM整合_產品與物料整合
///
/// WF產品與物料整合 與E10ICD及T100不同,以item_category區分只處理產品或物料部分
///
///
///
private object funMESCallERPPRDMTLBasis_WF(Collection colParameters = null)
{
object funMESCallERPPRDMTLBasis_WFRet = default(object);
var XmlDoc = new XmlDocument();
var CollectionSQL = new Collection();
// ===========================================================
// 宣告 AutoRunJob設定及執行記錄 變數
// ===========================================================
string strParameter01 = ""; // 參數一,預設此功能fail通知EMAIL群組。
string strPageSize = "500"; // 參數二,分包筆數
int intRunTime = 5; // 參數三,分包執行次數,預設為5次
var strDate = default(string); // 參數四,手動重收時填上時間,如沒填則以log tableERP拋回的最後執行時間為主
string strSubject, strBody; // 寄送通知資訊
string strServiceName = "item.get_workflow";
// AutorunJob拋轉資訊
string strReturnMessage = ""; // 錯誤訊息(tblMESAutoRunLog.ReturnMessage),Chr(10)分隔錯誤項目。
var aryReturnMessage = new ArrayList(); // Catch Error Message (Exception及MES判定錯誤訊息)。
var colResponseXML = new Collection();
string strKey_Condition = "";
string strRequest_Datetime = "";
do
{
try
{
// Parameter01為參數一
// 作為Mail通知群組(GroupNo),放在最前面防止連線失敗無法寄送通知。
if (!(colParameters["Parameter01"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter01"]))))
{
strParameter01 = colParameters["Parameter01"].ToString().Trim();
}
else
{
aryReturnMessage.Add(TranslateMsg("Mail GroupNo [%NOT SET%]([%PARAMETER01%])!", strLanguageMode, strResourceDir)); // ===== 2021/05/18 Elvis 92880
break;
}
// Parameter02為參數二
// 分包筆數必須為數值型態,Add by KevinChang
strPageSize = "500";
if (Information.IsNumeric(colParameters["Parameter02"]))
{
if (!(colParameters["Parameter02"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter02"]))))
{
// 每封包筆數不可小於500筆,Add by KevinChang
if (Conversions.ToInteger(colParameters["Parameter02"]) < 500)
{
strPageSize = "500";
}
else
{
strPageSize = colParameters["Parameter02"].ToString().Trim();
}
}
}
// Parameter03為參數三
// 分包執行次數,預設為5次,必須為數值型態。
if (Information.IsNumeric(colParameters["Parameter03"]))
{
if (!(colParameters["Parameter03"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter03"]))))
{
intRunTime = Conversions.ToInteger(colParameters["Parameter03"]);
}
}
// Parameter04為參數四
// 手動重收時填上時間,如沒填則以log tableERP拋回的最後執行時間為主
if (!(colParameters["Parameter04"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter04"]))))
{
// 2022/10/19 Lena, 日期格式調整為 yyyy/MM/dd HH:mm:ss
// strDate = GetDate(colParameters("Parameter04"), "Parameter04")
if (Information.IsDate(colParameters["Parameter04"]))
{
strDate = Strings.Format(Conversions.ToDate(colParameters["Parameter04"]), "yyyy/MM/dd HH:mm:ss");
}
else
{
throw new Exception(Conversions.ToString("Parameter04 value is " +
colParameters["Parameter04"] + " DateTime Format is Error!(The format string like: yyyy/MM/dd HH:mm:ss)"));
}
}
else
{
// strDate = GetERPTransactionDate(strServiceName)
string strERPDate;
strERPDate = GetERPTransactionDate(strServiceName);
if ((strERPDate ?? "") != defString)
{
strDate = strERPDate;
if (strERPDate.Length > 14)
{
strDate = Strings.Mid(strERPDate, 1, 4) + "/" + Strings.Mid(strERPDate, 5, 2) + "/" + Strings.Mid(strERPDate, 7, 2) + " " + Strings.Mid(strERPDate, 9, 2) + ":" + Strings.Mid(strERPDate, 11, 2) + ":" + Strings.Mid(strERPDate, 13, 2);
}
}
}
// 取得erp資訊
GetERPSetting_WF();
// If (Not GetERPSetting(dtERPSetting, "WorkFlow")) Then
// aryReturnMessage.Add(TranslateMsg("[%PleaseCheck%] EAI ERP Setting Info [%CONFIGSETTING%]!"))
// Exit Try
// End If
bool chkStatus = true;
// 抓取其它status為0之資料且塞入colResponseXML
GetReTransData(strServiceName, ref colResponseXML);
// 判斷『當前回傳筆數』=『應回傳筆數』時才代表為最後一次請求,執行後才進行後續動作
InXml = CombineRequestXML_item_get_WF("8", strPageSize, strKey_Condition, strDate);
int intloopTimes = 0;
string strCode = default(string);
string strSql_Code = default(string);
string strDescription = default(string);
do
{
// 迴圈執行超過intRunTime(預設5)次直接跳出迴圈
if (intloopTimes >= intRunTime)
{
break;
}
// 先確認是否有測試檔案,有的話就讀取出xml
OutXml = string.Empty;
OutXml = LoadXmlFileForTest(strServiceName);
try
{
if (string.IsNullOrEmpty(OutXml))
{
// ----- Call ERP Web Service -----
using (var ws = new wsERP_WorkFlow.WFMESService())
{
ws.Url = gERPWSURL;
OutXml = ws.XMLAdapter(InXml);
}
// 2017-05-03, Joe, 轉換單引號
OutXml = OutXml.Replace("'", "''");
}
}
catch (Exception ex)
{
OutXml = ex.Message;
throw ex;
}
finally
{
// 需等到取得所有資料後,再處理後面之動作,故統一將請求完之ResponseXML放入容器內
colResponseXML.Add(OutXml);
}
XmlDoc.LoadXml(OutXml);
// 執行ERP交易完畢寫入Log
string argstrException = null;
// 將ERP拋回的資料轉成物件
modAutoRunLibrary.addTransactionLog(InXml, OutXml, DateTime.Now.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPProductBasis_WF", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), "success", "ERP", strServiceName, strException: argstrException);
chkExecutionStatus_WF(XmlDoc, ref strCode, ref strSql_Code, ref strDescription, ref strKey_Condition, ref strRequest_Datetime);
if (strCode == "0")
{
if (string.IsNullOrEmpty(strKey_Condition))
break;
InXml = CombineRequestXML_item_get_WF("8", strPageSize, strKey_Condition, strDate);
}
else
{
chkStatus = false;
aryReturnMessage.Add(OutXml); // 2017-06-26, Joe, 如是中台層的錯誤要往外拋
break;
}
intloopTimes += 1;
}
while (true);
// 寫入log table
TreatWriteLogTable_WF(colResponseXML, strServiceName);
// 寫入MES DB
if (chkStatus)
{
foreach (string strOutXML in colResponseXML)
{
if (WriteProductOrMaterailBasis_WF(strOutXML, ref aryReturnMessage) < 0)
{
if (aryReturnMessage.Count == 0) // 避免不明原因,執行FAIL又沒收集到項目.
{
aryReturnMessage.Add(TranslateMsg("item_get, [%INVOKE FAIL%]!", strLanguageMode, strResourceDir));
}
}
}
}
}
catch (Exception EX_AUT)
{
aryReturnMessage.Add("EX_AUT.Exception" + '\n' + EX_AUT.Message.ToString());
OutXml = EX_AUT.Message.ToString();
results = "fail";
// 執行ERP交易完畢寫入Log
string argstrException = null;
modAutoRunLibrary.addTransactionLog_ErrorCode(InXml, OutXml, DateTime.Now.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPProductBasis_WF", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), results, "ERP", strServiceName, LogClass: "AutoRun", strException: argstrException);
}
finally
{
// --------------------------------------------------
// 回傳執行結果:succces 或 fail(ReturnMessage)
// --------------------------------------------------
if (aryReturnMessage.Count == 0)
{
funMESCallERPPRDMTLBasis_WFRet = "success";
results = "success";
}
else
{
// 組合執行錯誤字串: Chr(10)分隔
strReturnMessage = ArrayList2String(ref aryReturnMessage);
if ((strReturnMessage ?? "") == defString)
{
// 當錯誤字串組合失敗。補上
strReturnMessage = "ReturnMessage收集失敗!!";
}
// tblMESAutoRunLog.ReturnMessage 長度4000限制.
string strTemp = "";
if (strReturnMessage.Length > 4000)
{
// 自 strReturnMessage 中截取0-3991碼.
strTemp = strReturnMessage.Substring(0, 3991) + "...";
}
else
{
strTemp = strReturnMessage;
}
// 更新log table異常資訊
// Dim nodeID As XmlNode = XmlDoc.SelectSingleNode("/response/reqid")
// UpdateLogTableErrorInfo(nodeID.InnerText, strTemp)
UpdateLogTableErrorInfo(colResponseXML, strServiceName, strTemp);
// //fail;
funMESCallERPPRDMTLBasis_WFRet = CombineFailMsg("0000-999999", strTemp);
}
// ===manties:0095454 AutoRun addTransactionLog位置錯誤 需移至Finally 2021/07/06
// 執行ERP交易完畢寫入Log
string argstrException = null;
modAutoRunLibrary.addTransactionLog(InXml, OutXml, DateTime.Now.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPProductBasis_WF", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), results, "ERP", strServiceName, strException: argstrException);
}
}
// ===
while (false);
// --------------------------------------------------
// 當執行失敗,寄送 Email。必須有設定參數一。
// --------------------------------------------------
IDbConnection argcnnTemp = null;
try
{
if (aryReturnMessage.Count > 0 && Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(colParameters["Parameter01"], "", false)))
{
strSubject = "[AUT]料件-基本資料抛轉失敗! ";
strBody = Strings.Replace(strReturnMessage, Conversions.ToString('\n'), "
", Compare: CompareMethod.Text);
// 寄送 Email
argcnnTemp = CreateConnection(strConnectionString);
if (ERP2MES_MailNotice(ref argcnnTemp, ref aryReturnMessage, strSubject, strParameter01, CInput(strBody)) < 0)
{
// '寄送不成功, ReturnMessage 再增加1項.
// 'ProductIntegration += Chr(10) & aryReturnMessage.Item(aryReturnMessage.Count - 1).ToString
// 寄送不成功, ReturnMessage 再增加1項.
// tblMESAutoRunLog.ReturnMessage 長度4000限制.
if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(funMESCallERPPRDMTLBasis().ToString().Length, 4000, false)))
{
string strTemp = "";
strTemp = strReturnMessage;
if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(strTemp +
aryReturnMessage[aryReturnMessage.Count - 1].ToString().Length, 4000, false)))
{
strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]);
}
else
{
strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]);
// 自 strTemp 中截取0-3991碼.
strTemp = strTemp.Substring(0, 3991) + "...";
}
// //fail;
funMESCallERPPRDMTLBasis_WFRet = CombineFailMsg("0000-999999", strTemp);
}
}
}
}
catch (Exception)
{
throw;
}
finally
{
CloseConnection(argcnnTemp);
}
return funMESCallERPPRDMTLBasis_WFRet;
}
///
/// funMESCallERPPRDMTLBasis_WF接口呼叫WF端時的RequestXML
///
///
///
///
///
///
///
///
///
///
///
///
public string CombineRequestXML_item_get_WF(string DoAction = "8", string PageSize = "500", string key_condition = "", string request_datetime = "", string User = null, string Password = null, string ApplicationName = null, string Source = null, string Oraganization = null, string Language = null)
{
string CombineRequestXML_item_get_WFRet = default(string);
GetERPSetting_WF();
try
{
// ERPSignIn改由來自資料庫的ERP Setting表
if (User == null)
User = gERPUser;
if (Password == null)
Password = gERPPassword;
if (ApplicationName == null)
ApplicationName = "MES";
if (Source == null)
Source = modWIN.gComputerName;
if (Oraganization == null)
Oraganization = gERPOraganization;
if (Language == null)
Language = gERPLanguage;
}
catch (Exception ex)
{
CombineRequestXML_item_get_WFRet = "CombineRequestXML_item_get_WF fail;" + ex.Message;
}
CombineRequestXML_item_get_WFRet = "" + '\n';
CombineRequestXML_item_get_WFRet += "" + Oraganization + "" + '\n';
CombineRequestXML_item_get_WFRet += "" + DoAction + "" + '\n';
CombineRequestXML_item_get_WFRet += "" + User + "" + '\n';
CombineRequestXML_item_get_WFRet += "" + Password + "" + '\n';
CombineRequestXML_item_get_WFRet += "" + ApplicationName + "" + '\n';
CombineRequestXML_item_get_WFRet += "" + modWIN.gComputerName + "" + '\n';
CombineRequestXML_item_get_WFRet += "" + DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss") + "" + '\n';
CombineRequestXML_item_get_WFRet += "" + strDefLanguage + "" + '\n';
CombineRequestXML_item_get_WFRet += "" + request_datetime + "" + '\n';
CombineRequestXML_item_get_WFRet += "" + PageSize + "" + '\n';
CombineRequestXML_item_get_WFRet += "" + key_condition + "" + '\n';
CombineRequestXML_item_get_WFRet += "" + '\n';
CombineRequestXML_item_get_WFRet += "";
return CombineRequestXML_item_get_WFRet;
}
///
/// 解析WF(Work Flow)回傳表頭
///
/// 傳入XML
///
///
///
///
public bool chkExecutionStatus_WF(XmlDocument Xmldoc, ref string code, ref string sql_code, ref string description, ref string key_condition, ref string request_datetime)
{
bool chkExecutionStatus_WFRet = default(bool);
chkExecutionStatus_WFRet = false;
var de = Xmldoc.DocumentElement["execution"];
if (de == null == true)
return chkExecutionStatus_WFRet;
for (int i = 0, loopTo = de.ChildNodes.Count - 1; i <= loopTo; i++)
{
if (de.ChildNodes[i].Name == "status")
{
var cn = de.ChildNodes[i];
code = de.ChildNodes[i].Attributes["code"].Value.ToString();
sql_code = de.ChildNodes[i].Attributes["sql_code"].Value.ToString();
description = de.ChildNodes[i].Attributes["description"].Value.ToString();
chkExecutionStatus_WFRet = true;
}
}
key_condition = "";
if (Xmldoc.DocumentElement.GetElementsByTagName("key_condition").Count > 0)
{
if (!string.IsNullOrEmpty(Xmldoc.GetElementsByTagName("key_condition").Item(0).InnerText))
{
key_condition = Xmldoc.GetElementsByTagName("key_condition").Item(0).InnerText;
}
}
request_datetime = "";
if (Xmldoc.DocumentElement.GetElementsByTagName("request_datetime").Count > 0)
{
if (!string.IsNullOrEmpty(Xmldoc.GetElementsByTagName("request_datetime").Item(0).InnerText))
{
request_datetime = Xmldoc.GetElementsByTagName("request_datetime").Item(0).InnerText;
}
}
return chkExecutionStatus_WFRet;
}
///
/// 解析item_get_detail Value Tag Detail回傳Dictionary(Of String, String)
///
///
///
public DataTable GetXML_DetailValue2Dictionary_WF(XmlDocument Xmldoc)
{
DataTable GetXML_DetailValue2Dictionary_WFRet = default(DataTable);
var dtResult = new DataTable("item_get_detail");
XmlNodeList xmlList;
try
{
// 先加入欄位資訊
if (Xmldoc.DocumentElement.GetElementsByTagName("item_get_detail").Count > 0)
{
// 2022/10/19 Lena, 修正 ERF 回拋是沒有明細資料時的錯誤.
if (Xmldoc.GetElementsByTagName("item_get_detail").Item(0).SelectNodes("value").Count > 0)
{
xmlList = Xmldoc.GetElementsByTagName("item_get_detail").Item(0).SelectNodes("value");
for (int i = 0; i <= 0; i++)
{
for (int j = 0, loopTo = xmlList[i].ChildNodes.Count - 1; j <= loopTo; j++)
{
if (xmlList[i].ChildNodes[j] != null)
{
if (!dtResult.Columns.Contains(xmlList[i].ChildNodes[j].Name))
{
dtResult.Columns.Add(xmlList[i].ChildNodes[j].Name, Type.GetType("System.String"));
}
}
}
}
// 每個List新增一筆資料
for (int i = 0, loopTo1 = xmlList.Count - 1; i <= loopTo1; i++)
{
var drAdd = dtResult.NewRow();
for (int j = 0, loopTo2 = xmlList[i].ChildNodes.Count - 1; j <= loopTo2; j++)
{
if (xmlList[i].ChildNodes[j] != null)
{
drAdd[xmlList[i].ChildNodes[j].Name] = xmlList[i].ChildNodes[j].InnerText;
}
else
{
drAdd[xmlList[i].ChildNodes[j].Name] = "";
}
}
dtResult.Rows.Add(drAdd);
}
}
}
}
catch (Exception ex)
{
throw;
}
finally
{
GetXML_DetailValue2Dictionary_WFRet = dtResult;
}
return GetXML_DetailValue2Dictionary_WFRet;
}
///
/// 確認分包資料回傳時,是否仍有後續資料,沒有則回傳fale中斷處理
///
///
///
public bool CheckOutXMLData(string OutXML)
{
bool CheckOutXMLDataRet = default(bool);
CheckOutXMLDataRet = false;
var XmlDoc = new XmlDocument();
XmlDoc.LoadXml(OutXML);
if (XmlDoc.GetElementsByTagName("returnvalue").Item(0).SelectNodes("item_get_detail").Count > 0)
{
CheckOutXMLDataRet = true;
}
return CheckOutXMLDataRet;
}
///
/// 根據XML List內容新增或刪除產品與物料主檔(不同與T100與E10ICD item_category="A" 只處理產品主檔 ,item_category="M"只處理物料主檔)
///
///
///
///
private int WriteProductOrMaterailBasis_WF(string OutXML, ref ArrayList aryReturnMessage)
{
int WriteProductOrMaterailBasis_WFRet = default(int);
WriteProductOrMaterailBasis_WFRet = -1; // Return -1:fail,0:Success
// ===========================================================
// 宣告 DB相關 變數
// ===========================================================
var drTemp = default(DbDataReader);
IDbConnection cnnMES = null;
Collection colSQL_2MES = new Collection(), colSQL_2MES_Rows = new Collection(); // MES正式異動資料(主要).
string strSQL;
string strSQLCol;
string strSQLVal;
// 每筆中介交易記錄
string strIfWhereCond_PK;
string strMES_Result;
string strMES_MESSAGE; // 錯誤訊息(中介表.MES_MESSAGE),Chr(10)分隔錯誤項目。
var aryMES_Message = new ArrayList(); // 收集單筆中介交易記錄的錯誤記錄, Exception及MES判定錯誤訊息。
try
{
cnnMES = CreateConnection(strConnectionString);
// 宣告拋轉資料使用變數
string strERP_ProductNo, strERP_MaterialNo, strERP_ProductVersion, strERP_status, strERP_UnitNo, strERP_ItemName, strErpNo, strERP_SpecNo, strERP_LotManage = default(string);
DataRow drChk;
// 預設值
string strProductType = "PRODUCT"; // 給予預設值"PRODUCT",若不存在則自動新增產品類別.
int intIssueState = 0;
int intCurVersion = 0;
string strMaterialType = "MATERIL"; // 給予預設值"MATERIL",若不存在則自動新增物料類別.
int intPutInPlace = 3; // 投料點:預設為3(工單).
int intCountWay = 1; // 計量方法:預設為1(實際用量).
int intCheckLotNo = 1; // 物料批號檢查:預設為0(不檢查批號).
var aryProductType = new ArrayList(); // 記錄產品類別是否新增
var aryMaterialType = new ArrayList(); // 記錄物料類別是否新增
var aryUnitNo = new ArrayList(); // 記錄單位主檔是否新增
do
{
try
{
var XmlDoc = new XmlDocument();
XmlDoc.LoadXml(OutXML);
// 將OutXML解析為資料表型態,方便後續新增刪除的處理
var dtDetail = GetXML_DetailValue2Dictionary_WF(XmlDoc);
bool exitTry2 = false;
for (int intRow = 0, loopTo = dtDetail.Rows.Count - 1; intRow <= loopTo; intRow++)
{
if (string.IsNullOrWhiteSpace(Conversions.ToString(dtDetail.Rows[intRow]["item_category"])))
{
aryMES_Message.Add(TranslateMsg("item_category" + " [%Is Empty%]!", strLanguageMode, strResourceDir));
break;
}
if (dtDetail.Rows[intRow]["item_category"].Equals("A")) // 處理產品類型
{
// -----------------------------------------------------------
// 固定檢查ProductType='PRODUCT'資料,若不存在則自動新增。
// -----------------------------------------------------------
// If AddProductType(cnnMES, colSQL_2MES, colSQL_2MES_Rows, aryMES_Message, strProductType, strERPCreator, DateTime.Now, "AutoRun建立") < 0 Then Exit Try
if (aryProductType.IndexOf(strProductType) == -1)
{
if (AddProductType(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strProductType, strERPCreator, DateTime.Now, "AutoRun建立") < 0)
{
exitTry2 = true;
break;
}
else
{
aryProductType.Add(strProductType);
}
}
// -----------------------------------------------------------
// 取出各欄位資料
// -----------------------------------------------------------
strERP_ProductNo = dtDetail.Rows[intRow]["item_no"].ToString().Trim().ToUpper();
strErpNo = dtDetail.Rows[intRow]["item_no"].ToString().Trim(); // 記錄原始之ERP編號
strERP_ProductVersion = Interaction.IIf(string.IsNullOrWhiteSpace(dtDetail.Rows[intRow]["item_ver"].ToString()), "1", dtDetail.Rows[intRow]["item_ver"]).ToString().Trim();
strERP_status = dtDetail.Rows[intRow]["transstatus"].ToString().Trim().ToUpper();
// 2022/10/19 Lena,修正錯誤
if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtDetail.Rows[intRow]["production_unit_no"], "", false)))
{
strERP_UnitNo = "N/A";
}
else // 單位有傳入才作檢查
{
string strUnitNo = dtDetail.Rows[intRow]["production_unit_no"].ToString().Trim();
strERP_UnitNo = dtDetail.Rows[intRow]["production_unit_no"].ToString().Trim().ToLower();
// -----------------------------------------------------------
// 檢查UnitNo資料,若不存在則自動新增。
// -----------------------------------------------------------
if (aryUnitNo.IndexOf(strERP_UnitNo) == -1)
{
if (AddUnitNo(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strUnitNo, strERPCreator, DateTime.Now, "AutoRun建立") < 0)
{
exitTry2 = true;
break;
}
else
{
aryUnitNo.Add(strERP_UnitNo);
}
}
}
strERP_ItemName = Conversions.ToString(Interaction.IIf(string.IsNullOrWhiteSpace(Conversions.ToString(dtDetail.Rows[intRow]["item_name"])), "N/A", dtDetail.Rows[intRow]["item_name"]));
strERP_SpecNo = Conversions.ToString(Interaction.IIf(string.IsNullOrWhiteSpace(Conversions.ToString(dtDetail.Rows[intRow]["specno"])), "N/A", dtDetail.Rows[intRow]["specno"]));
// 檢查是否有此產品設定
strSQL = "Select ProductNo,IssueState From tblPRDProductBasis " + " Where ProductNo='" + strERP_ProductNo + "'" + " And ProductVersion='" + strERP_ProductVersion + "'";
//cmmTemp = new IDbCommand(strSQL, cnnMES);
drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES);
bool exitTry = false;
switch (strERP_status ?? "")
{
case "AU": // 有資料修改沒資料新增
{
if (!drTemp.Read())
{
intIssueState = 0;
// -----------------------------------------------------------
// 產品編號合理性檢查
// 2019/07/22 Eric 啟用檢查
// -----------------------------------------------------------
if (ProductIntegration_ChkValid_ProductNo(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_ProductNo, strERP_ProductVersion) < 0)
{
exitTry2 = exitTry = true;
break; // GoTo lblExitTry_2_NextRow
}
// -----------------------------------------------------------
// 新增MES產品設定
// -----------------------------------------------------------
strSQLCol = "Insert Into tblPRDProductBasis " + "(ProductNo,ProductVersion,ProductName,ProductType," + " UnitNo,UnitType,ItemSpec,Description," + " IssueState,CurVersion,Creator,CreateDate,ERPNo,QCCategory";
strSQLVal = ") Values('" + strERP_ProductNo + "','" + strERP_ProductVersion + "','" + strERP_ItemName + "','" + strProductType + "','" + strERP_UnitNo + "','" + strERP_UnitNo + "','" + strERP_SpecNo + "','AutoRun建立'," + intIssueState + "," + intCurVersion + ",'" + strERPCreator + "'," + "To_Date('" + Strings.Format(DateTime.Now, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'), '" + strErpNo + "', 'N/A'";
// 2022/10/19 Lane, 修正欄位名稱錯誤的問題
if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined01"])))
{
strSQLCol += ",User_Defined01";
strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined01"].ToString().Trim()), "'"));
}
if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined02"])))
{
strSQLCol += ",User_Defined02";
strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined02"].ToString().Trim()), "'"));
}
if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined03"])))
{
strSQLCol += ",User_Defined03";
strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined03"].ToString().Trim()), "'"));
}
if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined04"])))
{
strSQLCol += ",User_Defined04";
strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined04"].ToString().Trim()), "'"));
}
if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined05"])))
{
strSQLCol += ",User_Defined05";
strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined05"].ToString().Trim()), "'"));
}
if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined06"])))
{
strSQLCol += ",User_Defined06";
strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined06"].ToString().Trim()), "'"));
}
if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined07"])))
{
strSQLCol += ",User_Defined07";
strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined07"].ToString().Trim()), "'"));
}
if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined08"])))
{
strSQLCol += ",User_Defined08";
strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined08"].ToString().Trim()), "'"));
}
if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined09"])))
{
strSQLCol += ",User_Defined09";
strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined09"].ToString().Trim()), "'"));
}
if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined10"])))
{
strSQLCol += ",User_Defined10";
strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined10"].ToString().Trim()), "'"));
}
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine11")) Then
// strSQLCol += ",User_Defined11"
// strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine11").Trim + "'"
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine12")) Then
// strSQLCol += ",User_Defined12"
// strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine12").Trim + "'"
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine13")) Then
// strSQLCol += ",User_Defined13"
// strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine13").Trim + "'"
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine14")) Then
// strSQLCol += ",User_Defined14"
// strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine14").Trim + "'"
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine15")) Then
// strSQLCol += ",User_Defined15"
// strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine15").Trim + "'"
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine16")) Then
// strSQLCol += ",User_Defined16"
// strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine16").Trim + "'"
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine17")) Then
// strSQLCol += ",User_Defined17"
// strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine17").Trim + "'"
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine18")) Then
// strSQLCol += ",User_Defined18"
// strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine18").Trim + "'"
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine19")) Then
// strSQLCol += ",User_Defined19"
// strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine19").Trim + "'"
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine20")) Then
// strSQLCol += ",User_Defined20"
// strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine20").Trim + "'"
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine21")) Then
// strSQLCol += ",User_Defined21"
// strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine21")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine22")) Then
// strSQLCol += ",User_Defined22"
// strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine22")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine23")) Then
// strSQLCol += ",User_Defined23"
// strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine23")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine24")) Then
// strSQLCol += ",User_Defined24"
// strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine24")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine25")) Then
// strSQLCol += ",User_Defined25"
// strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine25")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine26")) Then
// strSQLCol += ",User_Defined26"
// strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine26")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine27")) Then
// strSQLCol += ",User_Defined27"
// strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine27")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine28")) Then
// strSQLCol += ",User_Defined28"
// strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine28")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine29")) Then
// strSQLCol += ",User_Defined29"
// strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine29")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine30")) Then
// strSQLCol += ",User_Defined30"
// strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine30")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine31")) Then
// strSQLCol += ",User_Defined31"
// strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine31").Trim + "'"
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine32")) Then
// strSQLCol += ",User_Defined32"
// strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine32").Trim + "'"
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine33")) Then
// strSQLCol += ",User_Defined33"
// strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine33").Trim + "'"
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine34")) Then
// strSQLCol += ",User_Defined34"
// strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine34").Trim + "'"
// End If
// 2017-05-22, Joe, Add 圖號
// 2022/10/19 修正欄位名稱的錯誤
if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["graph_no"])))
{
strSQLCol += ",GraphNo";
strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["graph_no"].ToString().Trim()), "'"));
}
strSQL = strSQLCol + strSQLVal + ")";
colSQL_2MES.Add(strSQL);
colSQL_2MES_Rows.Add(1);
}
else
{
// -----------------------------------------------------------
// 修改MES產品設定
// -----------------------------------------------------------
// 2017-06-02, Joe, 修改時如原狀態為-1變更為0,其他不異動
if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], -1, false)))
{
intIssueState = 0;
}
else
{
intIssueState = Conversions.ToInteger(drTemp["IssueState"]);
}
// 2017-06-08, Joe, 修改為異動CurVersion
strSQL = "Update tblPRDProductBasis Set " + " IssueState = " + intIssueState + " , ProductName = '" + strERP_ItemName + "', UnitNo = '" + strERP_UnitNo + "', UnitType = '" + strERP_UnitNo + "' " + " ,ProductType = '" + strProductType + "', ItemSpec = '" + strERP_SpecNo + "', ERPNo = '" + strErpNo + "' ";
// 2022/10/19 Lena, 修正欄位名稱錯誤的問題
if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined01"])))
{
strSQL = Conversions.ToString(strSQL + ",User_Defined01='" +
dtDetail.Rows[intRow]["userdefined01"].ToString().Trim() + "'");
}
if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined02"])))
{
strSQL = Conversions.ToString(strSQL + ",User_Defined02='" +
dtDetail.Rows[intRow]["userdefined02"].ToString().Trim() + "'");
}
if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined03"])))
{
strSQL = Conversions.ToString(strSQL + ",User_Defined03='" +
dtDetail.Rows[intRow]["userdefined03"].ToString().Trim() + "'");
}
if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined04"])))
{
strSQL = Conversions.ToString(strSQL + ",User_Defined04='" +
dtDetail.Rows[intRow]["userdefined04"].ToString().Trim() + "'");
}
if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined05"])))
{
strSQL = Conversions.ToString(strSQL + ",User_Defined05='" +
dtDetail.Rows[intRow]["userdefined05"].ToString().Trim() + "'");
}
if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined06"])))
{
strSQL = Conversions.ToString(strSQL + ",User_Defined06='" +
dtDetail.Rows[intRow]["userdefined06"].ToString().Trim() + "'");
}
if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined07"])))
{
strSQL = Conversions.ToString(strSQL + ",User_Defined07='" +
dtDetail.Rows[intRow]["userdefined07"].ToString().Trim() + "'");
}
if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined08"])))
{
strSQL = Conversions.ToString(strSQL + ",User_Defined08='" +
dtDetail.Rows[intRow]["userdefined08"].ToString().Trim() + "'");
}
if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined09"])))
{
strSQL = Conversions.ToString(strSQL + ",User_Defined09='" +
dtDetail.Rows[intRow]["userdefined09"].ToString().Trim() + "'");
}
if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined10"])))
{
strSQL = Conversions.ToString(strSQL + ",User_Defined10='" +
dtDetail.Rows[intRow]["userdefined10"].ToString().Trim() + "'");
}
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine11")) Then
// strSQL += ",User_Defined11='" & dtDetail.Rows(intRow)("userdefine11").Trim & "'"
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine12")) Then
// strSQL += ",User_Defined12='" & dtDetail.Rows(intRow)("userdefine12").Trim & "'"
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine13")) Then
// strSQL += ",User_Defined13='" & dtDetail.Rows(intRow)("userdefine13").Trim & "'"
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine14")) Then
// strSQL += ",User_Defined14='" & dtDetail.Rows(intRow)("userdefine14").Trim & "'"
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine15")) Then
// strSQL += ",User_Defined15='" & dtDetail.Rows(intRow)("userdefine15").Trim & "'"
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine16")) Then
// strSQL += ",User_Defined16='" & dtDetail.Rows(intRow)("userdefine16").Trim & "'"
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine17")) Then
// strSQL += ",User_Defined17='" & dtDetail.Rows(intRow)("userdefine17").Trim & "'"
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine18")) Then
// strSQL += ",User_Defined18='" & dtDetail.Rows(intRow)("userdefine18").Trim & "'"
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine19")) Then
// strSQL += ",User_Defined19='" & dtDetail.Rows(intRow)("userdefine19").Trim & "'"
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine20")) Then
// strSQL += ",User_Defined20='" & dtDetail.Rows(intRow)("userdefine20").Trim & "'"
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine21")) Then
// strSQL += ",User_Defined21=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine21")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine22")) Then
// strSQL += ",User_Defined22=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine22")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine23")) Then
// strSQL += ",User_Defined23=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine23")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine24")) Then
// strSQL += ",User_Defined24=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine24")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine25")) Then
// strSQL += ",User_Defined25=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine25")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine26")) Then
// strSQL += ",User_Defined26=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine26")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine27")) Then
// strSQL += ",User_Defined27=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine27")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine28")) Then
// strSQL += ",User_Defined28=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine28")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine29")) Then
// strSQL += ",User_Defined29=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine29")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine30")) Then
// strSQL += ",User_Defined30=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine30")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine31")) Then
// strSQL += ",User_Defined31='" + dtDetail.Rows(intRow)("userdefine31").Trim + "'"
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine32")) Then
// strSQL += ",User_Defined32='" + dtDetail.Rows(intRow)("userdefine32").Trim + "'"
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine33")) Then
// strSQL += ",User_Defined33='" + dtDetail.Rows(intRow)("userdefine33").Trim + "'"
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine34")) Then
// strSQL += ",User_Defined34='" + dtDetail.Rows(intRow)("userdefine34").Trim + "'"
// End If
// 2017-05-22, Joe, Add 圖號
if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["graph_no"])))
{
strSQL = Conversions.ToString(strSQL + ",GraphNo='" +
dtDetail.Rows[intRow]["graph_no"].ToString().Trim() + "'");
}
strSQL += " Where ProductNo='" + strERP_ProductNo + "' And ProductVersion='" + strERP_ProductVersion + "'";
colSQL_2MES.Add(strSQL);
colSQL_2MES_Rows.Add(1);
}
drTemp.Close();
//cmmTemp.Dispose();
break;
}
case "D": // D:刪除
{
if (drTemp.Read())
{
if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], 0, false)))
{
// -----------------------------------------------------------
// 先刪除MES產品相關設定
// -----------------------------------------------------------
if (ProductIntegration_DelProduct(ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_ProductNo, strERP_ProductVersion) < 0)
{
exitTry2 = exitTry = true;
break; // GoTo lblExitTry_2_NextRow
}
}
else
{
// -----------------------------------------------------------
// 作廢MES產品設定
// -----------------------------------------------------------
strSQL = "Update tblPRDProductBasis Set " + " IssueState=-1" + " Where ProductNo='" + strERP_ProductNo + "'" + " And ProductVersion='" + strERP_ProductVersion + "'";
colSQL_2MES.Add(strSQL);
colSQL_2MES_Rows.Add(1);
}
}
// aryMES_Message.Add(TranslateMsg("[%PRODUCTNO%](item_no): " & strERP_ProductNo & ", [%PRODUCTVERSION%](item_ver): " & strERP_ProductVersion & ", [%IS NOT EXIST%], [%NOT ALLOW TO DELETE%]!!"))
// 刪除有可能會在資料庫中取不到資料,因為同一個交易還沒有commit;
else if (ProductIntegration_DelProduct(ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_ProductNo, strERP_ProductVersion) < 0)
{
exitTry2 = exitTry = true;
break;
}
drTemp.Close();
//cmmTemp.Dispose();
break;
}
default:
{
aryMES_Message.Add(TranslateMsg("[%PRODUCTNO%](item_no): " + strERP_ProductNo + ",[%TRANSTATUS%](tran_status):" + strERP_status + " [%INVALID%], [%NOT ALLOWED TO EXECUTE%]!!", strLanguageMode, strResourceDir));
break;
}
}
if (exitTry)
{
break;
}
}
else if (dtDetail.Rows[intRow]["item_category"].Equals("M")) // 處理物料類型
{
// -----------------------------------------------------------
// 固定檢查MaterialType='MATERIL'資料,若不存在則自動新增。
// -----------------------------------------------------------
// If AddMaterialType(cnnMES, colSQL_2MES, colSQL_2MES_Rows, aryMES_Message, strMaterialType, strERPCreator, DateTime.Now, "AutoRun建立") < 0 Then Exit Try
if (aryMaterialType.IndexOf(strMaterialType) == -1)
{
if (AddMaterialType(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strMaterialType, strERPCreator, DateTime.Now, "AutoRun建立") < 0)
{
exitTry2 = true;
break;
}
else
{
aryMaterialType.Add(strMaterialType);
}
}
// -----------------------------------------------------------
// 取出各欄位資料
// -----------------------------------------------------------
strERP_MaterialNo = dtDetail.Rows[intRow]["item_no"].ToString().Trim().ToUpper();
strErpNo = dtDetail.Rows[intRow]["item_no"].ToString().Trim(); // 記錄原始之ERP編號
strERP_ProductVersion = Interaction.IIf(string.IsNullOrWhiteSpace(Conversions.ToString(dtDetail.Rows[intRow]["item_ver"])), "1", dtDetail.Rows[intRow]["item_ver"]).ToString().Trim();
strERP_status = dtDetail.Rows[intRow]["transstatus"].ToString().Trim().ToUpper();
// 2022/10/19 Lena, 修正錯誤
if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtDetail.Rows[intRow]["production_unit_no"], "", false)))
{
strERP_UnitNo = "N/A";
}
else // 單位有傳入才作檢查
{
string strUnitNo = dtDetail.Rows[intRow]["production_unit_no"].ToString().Trim();
strERP_UnitNo = dtDetail.Rows[intRow]["production_unit_no"].ToString().Trim().ToLower();
// -----------------------------------------------------------
// 檢查UnitNo資料,若不存在則自動新增。
// -----------------------------------------------------------
if (aryUnitNo.IndexOf(strERP_UnitNo) == -1)
{
if (AddUnitNo(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strUnitNo, strERPCreator, DateTime.Now, "AutoRun建立") < 0)
{
exitTry2 = true;
break;
}
else
{
aryUnitNo.Add(strERP_UnitNo);
}
}
}
strERP_ItemName = Conversions.ToString(Interaction.IIf(string.IsNullOrWhiteSpace(Conversions.ToString(dtDetail.Rows[intRow]["item_name"])), "N/A", dtDetail.Rows[intRow]["item_name"]));
strERP_SpecNo = Conversions.ToString(Interaction.IIf(string.IsNullOrWhiteSpace(Conversions.ToString(dtDetail.Rows[intRow]["specno"])), "N/A", dtDetail.Rows[intRow]["specno"]));
// 2019/07/08 Eric Mantis:59382 Lot_manage 欄位 批號管理 目前 T100 會拋轉 1,2,3 ,但是 MES 目前只有0/1 拋轉時並未轉換
// 0(False):不管控物料批號,系統將視物料批號為N/A。
// 1(True):管控物料批號,所有之進料、退料、扣料動作都必須輸入物料批號。
if (!string.IsNullOrWhiteSpace(Conversions.ToString(dtDetail.Rows[intRow]["checklotno"])))
{
// 91087: [605][CP+FT] E10ICD整合問題_E10ICD拋轉批號查核(lot_manage)欄位值調整,MES須同步對應"是否檢查批號(CheckLotNo)"欄位
if (dtDetail.Rows[intRow]["checklotno"].Equals("Y") | dtDetail.Rows[intRow]["checklotno"].Equals("N"))
{
if (dtDetail.Rows[intRow]["checklotno"].Equals("Y") == true)
{
strERP_LotManage = "1";
}
else if (dtDetail.Rows[intRow]["checklotno"].Equals("N") == true)
{
strERP_LotManage = "0";
}
}
else
{
strERP_LotManage = "0";
}
}
else
{
strERP_LotManage = "0";
}
// 檢查是否有此物料設定
drChk = GetMaterialBasis(strERP_MaterialNo, cnnMES, aryMES_Message);
if (drChk == null)
{
exitTry2 = true;
break;
} // GoTo lblExitTry_2_NextRow 'fail
bool exitTry1 = false;
switch (strERP_status ?? "")
{
case "AU": // 有資料修改沒資料新增
{
if (drChk["MaterialNo"] is DBNull)
{
// 2019/10/25 Eric Mantis:60113 調整成物料自動核准
intIssueState = 2;
// -----------------------------------------------------------
// 物料編號合理性檢查
// 2019/07/22 Eric 啟用檢查
// -----------------------------------------------------------
if (ProductIntegration_ChkValid_MaterialNo(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_MaterialNo) < 0)
{
exitTry2 = exitTry1 = true;
break; // GoTo lblExitTry_2_NextRow
}
// -----------------------------------------------------------
// 新增MES物料設定
// MaterialName,MaterialSpec 必要欄位填"N/A".
// -----------------------------------------------------------
strSQLCol = "Insert Into tblMTLMaterialBasis " + "(MaterialNo, MaterialName, MaterialSpec, MaterialType," + " PutInPlace, CountWay, CheckLotNo, UnitType, UnitNo, Description," + " IssueState, Creator, CreateDate, ERPNo, QCCategory";
strSQLVal = ") Values('" + strERP_MaterialNo + "','" + strERP_ItemName + "','" + strERP_SpecNo + "','" + strMaterialType + "'," + intPutInPlace + "," + intCountWay + "," + strERP_LotManage + ",'" + strERP_UnitNo + "','" + strERP_UnitNo + "','AutoRun建立'," + intIssueState + ",'" + strERPCreator + "'," + "To_Date('" + Strings.Format(DateTime.Now, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'), '" + strErpNo + "', 'N/A'";
// 2022/10/19 Lena, 修正欄位名稱的錯誤
if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined01"])))
{
strSQLCol += ",User_Defined01";
strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined01"].ToString().Trim()), "'"));
}
if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined02"])))
{
strSQLCol += ",User_Defined02";
strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined02"].ToString().Trim()), "'"));
}
if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined03"])))
{
strSQLCol += ",User_Defined03";
strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined03"].ToString().Trim()), "'"));
}
if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined04"])))
{
strSQLCol += ",User_Defined04";
strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined04"].ToString().Trim()), "'"));
}
if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined05"])))
{
strSQLCol += ",User_Defined05";
strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined05"].ToString().Trim()), "'"));
}
if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined06"])))
{
strSQLCol += ",User_Defined06";
strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined06"].ToString().Trim()), "'"));
}
if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined07"])))
{
strSQLCol += ",User_Defined07";
strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined07"].ToString().Trim()), "'"));
}
if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined08"])))
{
strSQLCol += ",User_Defined08";
strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined08"].ToString().Trim()), "'"));
}
if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined09"])))
{
strSQLCol += ",User_Defined09";
strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined09"].ToString().Trim()), "'"));
}
if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined10"])))
{
strSQLCol += ",User_Defined10";
strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined10"].ToString().Trim()), "'"));
}
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine11")) Then
// strSQLCol += ",User_Defined11"
// strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine11").Trim + "'"
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine12")) Then
// strSQLCol += ",User_Defined12"
// strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine12").Trim + "'"
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine13")) Then
// strSQLCol += ",User_Defined13"
// strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine13").Trim + "'"
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine14")) Then
// strSQLCol += ",User_Defined14"
// strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine14").Trim + "'"
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine15")) Then
// strSQLCol += ",User_Defined15"
// strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine15").Trim + "'"
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine16")) Then
// strSQLCol += ",User_Defined16"
// strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine16").Trim + "'"
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine17")) Then
// strSQLCol += ",User_Defined17"
// strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine17").Trim + "'"
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine18")) Then
// strSQLCol += ",User_Defined18"
// strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine18").Trim + "'"
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine19")) Then
// strSQLCol += ",User_Defined19"
// strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine19").Trim + "'"
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine20")) Then
// strSQLCol += ",User_Defined20"
// strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine20").Trim + "'"
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine21")) Then
// strSQLCol += ",User_Defined21"
// strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine21")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine22")) Then
// strSQLCol += ",User_Defined22"
// strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine22")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine23")) Then
// strSQLCol += ",User_Defined23"
// strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine23")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine24")) Then
// strSQLCol += ",User_Defined24"
// strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine24")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine25")) Then
// strSQLCol += ",User_Defined25"
// strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine25")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine26")) Then
// strSQLCol += ",User_Defined26"
// strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine26")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine27")) Then
// strSQLCol += ",User_Defined27"
// strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine27")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine28")) Then
// strSQLCol += ",User_Defined28"
// strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine28")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine29")) Then
// strSQLCol += ",User_Defined29"
// strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine29")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine30")) Then
// strSQLCol += ",User_Defined30"
// strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine30")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine31")) Then
// strSQLCol += ",User_Defined31"
// strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine31").Trim + "'"
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine32")) Then
// strSQLCol += ",User_Defined32"
// strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine32").Trim + "'"
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine33")) Then
// strSQLCol += ",User_Defined33"
// strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine33").Trim + "'"
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine34")) Then
// strSQLCol += ",User_Defined34"
// strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine34").Trim + "'"
// End If
// 2017-05-22, Joe, Add 圖號
if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["graph_no"])))
{
strSQLCol += ",GraphNo";
strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["graph_no"].ToString().Trim()), "'"));
}
strSQL = strSQLCol + strSQLVal + ")";
colSQL_2MES.Add(strSQL);
colSQL_2MES_Rows.Add(1);
}
else
{
// -----------------------------------------------------------
// 修改MES物料設定
// -----------------------------------------------------------
// 2017-06-02, Joe, 修改時如原狀態為-1變更為0,其他不異動
if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drChk["IssueState"], -1, false)))
{
intIssueState = 0;
}
else
{
intIssueState = Conversions.ToInteger(drChk["IssueState"]);
}
strSQL = "Update tblMTLMaterialBasis Set " + " IssueState = " + intIssueState + " , MaterialName = '" + strERP_ItemName + "', UnitType = '" + strERP_UnitNo + "', UnitNo = '" + strERP_UnitNo + "'" + ",CHECKLOTNO='" + strERP_LotManage + "',ERPNo='" + strErpNo + "' ";
// 2022/10/19 Lena, 修正欄位名稱錯誤的問題
if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined01"])))
{
strSQL = Conversions.ToString(strSQL + ",User_Defined01='" +
dtDetail.Rows[intRow]["userdefined01"].ToString().Trim() + "'");
}
if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined02"])))
{
strSQL = Conversions.ToString(strSQL + ",User_Defined02='" +
dtDetail.Rows[intRow]["userdefined02"].ToString().Trim() + "'");
}
if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined03"])))
{
strSQL = Conversions.ToString(strSQL + ",User_Defined03='" +
dtDetail.Rows[intRow]["userdefined03"].ToString().Trim() + "'");
}
if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined04"])))
{
strSQL = Conversions.ToString(strSQL + ",User_Defined04='" +
dtDetail.Rows[intRow]["userdefined04"].ToString().Trim() + "'");
}
if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined05"])))
{
strSQL = Conversions.ToString(strSQL + ",User_Defined05='" +
dtDetail.Rows[intRow]["userdefined05"].ToString().Trim() + "'");
}
if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined06"])))
{
strSQL = Conversions.ToString(strSQL + ",User_Defined06='" +
dtDetail.Rows[intRow]["userdefined06"].ToString().Trim() + "'");
}
if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined07"])))
{
strSQL = Conversions.ToString(strSQL + ",User_Defined07='" +
dtDetail.Rows[intRow]["userdefined07"].ToString().Trim() + "'");
}
if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined08"])))
{
strSQL = Conversions.ToString(strSQL + ",User_Defined08='" +
dtDetail.Rows[intRow]["userdefined08"].ToString().Trim() + "'");
}
if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined09"])))
{
strSQL = Conversions.ToString(strSQL + ",User_Defined09='" +
dtDetail.Rows[intRow]["userdefined09"].ToString().Trim() + "'");
}
if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined10"])))
{
strSQL = Conversions.ToString(strSQL + ",User_Defined10='" +
dtDetail.Rows[intRow]["userdefined10"].ToString().Trim() + "'");
}
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine11")) Then
// strSQL += ",User_Defined11='" & dtDetail.Rows(intRow)("userdefine11").Trim & "'"
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine12")) Then
// strSQL += ",User_Defined12='" & dtDetail.Rows(intRow)("userdefine12").Trim & "'"
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine13")) Then
// strSQL += ",User_Defined13='" & dtDetail.Rows(intRow)("userdefine13").Trim & "'"
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine14")) Then
// strSQL += ",User_Defined14='" & dtDetail.Rows(intRow)("userdefine14").Trim & "'"
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine15")) Then
// strSQL += ",User_Defined15='" & dtDetail.Rows(intRow)("userdefine15").Trim & "'"
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine16")) Then
// strSQL += ",User_Defined16='" & dtDetail.Rows(intRow)("userdefine16").Trim & "'"
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine17")) Then
// strSQL += ",User_Defined17='" & dtDetail.Rows(intRow)("userdefine17").Trim & "'"
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine18")) Then
// strSQL += ",User_Defined18='" & dtDetail.Rows(intRow)("userdefine18").Trim & "'"
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine19")) Then
// strSQL += ",User_Defined19='" & dtDetail.Rows(intRow)("userdefine19").Trim & "'"
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine20")) Then
// strSQL += ",User_Defined20='" & dtDetail.Rows(intRow)("userdefine20").Trim & "'"
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine21")) Then
// strSQL += ",User_Defined21=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine21")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine22")) Then
// strSQL += ",User_Defined22=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine22")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine23")) Then
// strSQL += ",User_Defined23=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine23")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine24")) Then
// strSQL += ",User_Defined24=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine24")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine25")) Then
// strSQL += ",User_Defined25=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine25")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine26")) Then
// strSQL += ",User_Defined26=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine26")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine27")) Then
// strSQL += ",User_Defined27=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine27")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine28")) Then
// strSQL += ",User_Defined28=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine28")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine29")) Then
// strSQL += ",User_Defined29=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine29")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine30")) Then
// strSQL += ",User_Defined30=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine30")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine31")) Then
// strSQL += ",User_Defined31='" + dtDetail.Rows(intRow)("userdefine31").Trim + "'"
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine32")) Then
// strSQL += ",User_Defined32='" + dtDetail.Rows(intRow)("userdefine32").Trim + "'"
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine33")) Then
// strSQL += ",User_Defined33='" + dtDetail.Rows(intRow)("userdefine33").Trim + "'"
// End If
// If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine34")) Then
// strSQL += ",User_Defined34='" + dtDetail.Rows(intRow)("userdefine34").Trim + "'"
// End If
// 2017-05-22, Joe, Add 圖號
if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["graph_no"])))
{
strSQL = Conversions.ToString(strSQL + ",GraphNo='" +
dtDetail.Rows[intRow]["graph_no"].ToString().Trim() + "'");
}
strSQL += " Where MaterialNo='" + strERP_MaterialNo + "'";
colSQL_2MES.Add(strSQL);
colSQL_2MES_Rows.Add(1);
}
break;
}
case "D": // D:刪除
{
// 檢查是否有此物料設定
drChk = GetMaterialBasis(strERP_MaterialNo, cnnMES, aryMES_Message);
if (drChk == null)
{
exitTry2 = exitTry1 = true;
break;
} // GoTo lblExitTry_2_NextRow 'fail
if (!(drChk["MaterialNo"] is DBNull))
{
// -----------------------------------------------------------
// 物料編號使用狀況檢查
// -----------------------------------------------------------
if (ProductIntegration_ChkforDelMaterialNo(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_MaterialNo) < 0)
{
exitTry2 = exitTry1 = true;
break; // GoTo lblExitTry_2_NextRow
}
if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drChk["IssueState"], 0, false)))
{
// -----------------------------------------------------------
// 刪除MES物料相關設定
// -----------------------------------------------------------
if (ProductIntegration_DelMaterial(ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_MaterialNo) < 0)
{
exitTry2 = exitTry1 = true;
break; // GoTo lblExitTry_2_NextRow
}
}
else
{
// -----------------------------------------------------------
// 作廢MES物料設定
// -----------------------------------------------------------
strSQL = "Update tblMTLMaterialBasis Set " + " IssueState=-1" + " Where MaterialNo='" + strERP_MaterialNo + "'";
colSQL_2MES.Add(strSQL);
colSQL_2MES_Rows.Add(1);
}
}
// aryMES_Message.Add(TranslateMsg("[%MATERIALNO%]item_no): " & strERP_MaterialNo & ", [%IS NOT EXIST%], [%NOT ALLOW TO DELETE%]!!"))
// 刪除有可能會在資料庫中取不到資料,因為同一個交易還沒有commit;
else if (ProductIntegration_DelMaterial(ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_MaterialNo) < 0)
{
exitTry2 = exitTry1 = true;
break; // GoTo lblExitTry_2_NextRow
}
break;
}
default:
{
aryMES_Message.Add(TranslateMsg("[%MATERIALNO%]item_no): " + strERP_MaterialNo + ",[%TRANSTATUS%](tran_status):" + strERP_status + " [%INVALID%], [%NOT ALLOWED TO EXECUTE%]!!", strLanguageMode, strResourceDir));
break;
}
}
if (exitTry1)
{
break;
}
}
}
if (exitTry2)
{
break;
}
}
catch (Exception EX_drIF)
{
strMES_Result = "9";
aryMES_Message.Add("WriteProductOrMaterailBasis.Exception" + '\n' + EX_drIF.Message);
}
finally
{
// ===============================================================================
// 判定 MES_Result 處理結果 (成功回寫1, 失敗回寫9).
// ===============================================================================
if (aryMES_Message.Count == 0)
{
strMES_Result = "1";
// --------------------------------------------------
// MES資料庫異動
// --------------------------------------------------
if (colSQL_2MES.Count > 0)
{
ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colSQL_2MES, colSQL_2MES_Rows);
}
}
// 組合執行錯誤字串: Chr(10)分隔
strMES_MESSAGE = ArrayList2String(ref aryMES_Message);
// MES_Message長度4000限制, 截取0-3996碼加"...".
if (strMES_MESSAGE.Length > 4000)
strMES_MESSAGE = strMES_MESSAGE.Substring(0, 3996) + "...";
// ---取消前面收集SQL---
colSQL_2MES.Clear();
colSQL_2MES_Rows.Clear();
// 當該筆交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。
if (aryMES_Message.Count > 0)
{
foreach (string strErr in aryMES_Message)
aryReturnMessage.Add(strErr);
}
}
}
while (false);
// //return 0 : Success
WriteProductOrMaterailBasis_WFRet = 0;
}
catch (Exception ex)
{
aryMES_Message.Add("WriteProductOrMaterailBasis,Finally:" + ex.Message);
// 當該筆交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。
foreach (string strErr in aryMES_Message)
aryReturnMessage.Add(strErr);
throw;
}
finally
{
if (drTemp != null)
drTemp.Close();
CloseConnection(cnnMES);
}
return WriteProductOrMaterailBasis_WFRet;
}
private void TreatWriteLogTable_WF(Collection colResponseXML, string strType)
{
Collection colLogSQL = new Collection(), colLogSQL_Rows = new Collection();
string lastID = default(string), KeepLog; // 最終請求完成之id
ArrayList idList = new ArrayList(), arySQL = new ArrayList(), arySQLParameter = new ArrayList();
var CreateDate = new DateTime();
string strCode = default(string);
string strSql_Code = default(string);
string strDescription = default(string);
foreach (string strOutXML in colResponseXML)
{
XmlDoc.LoadXml(strOutXML);
string strKey_Condition = "";
string strRequest_Datetime = "";
chkExecutionStatus_WF(XmlDoc, ref strCode, ref strSql_Code, ref strDescription, ref strKey_Condition, ref strRequest_Datetime);
// Dim nodeID As XmlNode = XmlDoc.SelectSingleNode("/response/reqid")
// Dim strID As String = InitOPSerial()
XmlNode nodeID;
string strID = string.Empty;
try
{
XmlDoc.LoadXml(strOutXML);
nodeID = XmlDoc.SelectSingleNode("/response/reqid");
}
catch (Exception ex)
{
nodeID = null;
}
if (nodeID == null)
{
strID = Guid.NewGuid().ToString();
}
else
{
strID = nodeID.InnerText;
}
// KeepLog = AppSettings("keepLog")
// If (KeepLog <> "") AndAlso (IsNumeric(KeepLog)) Then
// '----- 清除小於保留天數的 TransactionBasis Log -----
// CreateDate = DateAdd(DateInterval.Day, -1 * KeepLog, DateTime.Now)
// colLogSQL.Add("delete from TBLERPTRANSACTIONXMLLOG_BASIS where createdate < To_Date('" & Format(CreateDate, "yyyy/MM/dd H:mm:ss") & "','YYYY/MM/DD HH24:MI:SS')")
// colLogSQL_Rows.Add(-1)
// End If
// 判斷當有LOG資料時,先刪除再新增
if (HaveLogData(strID))
{
colLogSQL.Add("DELETE FROM TBLERPTRANSACTIONXMLLOG_BASIS WHERE ID = '" + strID + "'");
colLogSQL_Rows.Add(-1);
}
string pData_Time = string.Empty;
if (!string.IsNullOrEmpty(strRequest_Datetime.ToString()))
{
pData_Time = strRequest_Datetime;
}
int pStatus = -1;
if (strCode.Equals("0"))
{
pStatus = 1;
}
else
{
pStatus = -1;
}
ComposeERPTransactionXMLLog(strID, strID, strType, strOutXML, pData_Time, pStatus, strDescription, arySQL, arySQLParameter, 1);
// Dim strLogSQL As String = ComposeERPTransactionXMLLog(nodeID.InnerText, nodeID.InnerText, strType, strOutXML, pData_Time, pStatus, objResponse.description)
// colLogSQL.Add(strLogSQL)
// colLogSQL_Rows.Add(1)
lastID = strID;
idList.Add(strID);
}
// 將所有請求之BatchID設成最終請求完成之id
foreach (string strID in idList)
{
if ((strID ?? "") != (lastID ?? ""))
{
colLogSQL.Add("UPDATE TBLERPTRANSACTIONXMLLOG_BASIS SET BATCHID = '" + lastID + "' WHERE ID = '" + strID + "'");
colLogSQL_Rows.Add(1);
}
}
// 正式寫入log table
if (colLogSQL.Count > 0 || arySQL.Count > 0)
{
// Call ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colLogSQL, colLogSQL_Rows)
string argstrDatabaseType = Conversions.ToString(DataBaseType);
Collection argCollectionSQL_Rows = null;
ExecuteSQLNoneQuery_CLOB_Multi(argstrDatabaseType, strConnectionString, colLogSQL, arySQL, arySQLParameter, CollectionSQL_Rows: argCollectionSQL_Rows);
}
}
#endregion
#region ---工單用料回拋TP ICD---
private object funWIPMaterialDeductData_TPICD(Collection colParameters = null)
{
object funWIPMaterialDeductData_TPICDRet = default(object);
var cnnTemp = default(IDbConnection);
string strSQL;
string strAccess = string.Empty;
string strParameter = string.Empty;
string strMaster = string.Empty;
string strDetail = string.Empty;
string strTempField = string.Empty;
string strTempRecord = string.Empty;
var arriveTime = DateTime.Now;
string strGroupNo = string.Empty; // Mail通知群組
string strRowCount = "500"; //拋轉ERP筆數
string description = string.Empty; // Response... 錯誤訊息
string responseValue = string.Empty; // Request/Response... 收貨單單號, 成功回傳ERP收貨單號起始~截止單號
// 2021/03/30 Elvis 0087678: [瑞賢] AUTORUN報工--報工失敗,發送郵件新增提供失敗清單
//var ExcelExp = new Infragistics.Win.UltraWinGrid.ExcelExport.UltraGridExcelExporter();
//var workbook = new Infragistics.Documents.Excel.Workbook();
var aryReturnMessage = new ArrayList(); // Catch Error Message (Exception及MES判定錯誤訊息)。
var dsTemp = new DataSet();
var datNow = DateTime.Now;
DataTable MTLDeductTemp = null;
do
{
try
{
cnnTemp = CreateConnection(strConnectionString);
// Parameter01為參數一(使用者群組), 可以不設定
if (!(colParameters["Parameter01"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter01"]))))
{
strGroupNo = colParameters["Parameter01"].ToString().Trim();
//若有設定, 先檢查群組合理性
if (!string.IsNullOrEmpty(strGroupNo) && ERP2MES_MailNoticeChk(ref cnnTemp, ref aryReturnMessage, strGroupNo) < 0)
{
funWIPMaterialDeductData_TPICDRet = Conversions.ToString("fail;" + aryReturnMessage[0]);
return funWIPMaterialDeductData_TPICDRet; // 離開 Function。
}
}
// 拋轉ERP筆數必須為數值型態
if (Information.IsNumeric(colParameters["Parameter02"]))
{
if (!(colParameters["Parameter02"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter02"]))))
{
strRowCount = colParameters["Parameter02"].ToString().Trim();
}
}
// ---- InXml -----
//
// 2023/08/07,Lena, 調整為取出 TipTop ICD 連線資料
strAccess = cbXMLAccess_TP(ERPName: "TIPTOPICD");
//
strTempField = "";
strTempRecord = cbXMLRecord_TPICD(strTempField);
strParameter = cbXMLParameter_TPICD(strTempRecord);
int intItemNo = 1;
// 2023/08/09,Lena, 調整為只取2和4的用料拋 ERP
if (strDataBaseType != "oracle")
{
strSQL = "Select TOP " + Conversions.ToInteger(strRowCount) + " * From tblWIPMaterialDeductContent Where ERPFlag = 'N' and PutInPlaceType in (2,4) Order By DeductDate";
}
else
{
strSQL = "Select A.* From (Select * From tblWIPMaterialDeductContent Where ERPFlag = 'N' and PutInPlaceType in (2,4) Order By DeductDate) A Where RowNum <= " + Conversions.ToInteger(strRowCount);
}
ExecuteSQLQuery_Adapter(strSQL, dsTemp, "MTLDeduct", cnnTemp);
//目前的ERP Response
string strResponse = "";
if (dsTemp.Tables["MTLDeduct"].Rows.Count > 0)
{
datNow = DateTime.Now;
//
strTempField = "";
strTempRecord = cbXMLRecord_TP(strTempField);
strMaster = cbXMLMaster_TP("Master", strTempRecord);
MTLDeductTemp = dsTemp.Tables["MTLDeduct"].Clone();
//進行中的DataTypeNo
int stateType = Conversions.ToInteger(dsTemp.Tables["MTLDeduct"].Rows[0]["DataTypeNo"]);
for (int i = 0; i < dsTemp.Tables["MTLDeduct"].Rows.Count; i++)
{
DataRow drAdd = MTLDeductTemp.NewRow();
foreach (DataColumn dc in MTLDeductTemp.Columns)
{
drAdd[dc.ColumnName] = dsTemp.Tables["MTLDeduct"].Rows[i][dc.ColumnName];
}
MTLDeductTemp.Rows.Add(drAdd);
//沒有下一筆 或 下一筆與本筆DataTypeNo不相符,進行組成XML拋ERP
if (i + 1 == dsTemp.Tables["MTLDeduct"].Rows.Count ||
Conversions.ToInteger(dsTemp.Tables["MTLDeduct"].Rows[i + 1]["DataTypeNo"]) != stateType)
{
if (MTLDeductTemp != null && MTLDeductTemp.Rows.Count > 0)
{
string strDataType = "";
switch (Conversions.ToInteger(dsTemp.Tables["MTLDeduct"].Rows[i]["DataTypeNo"]))
{
case 1: //1:物料扣料
strDataType = "[%MaterialDeduct%]";
break;
case 2: //2:還原物料扣料
strDataType = "[%UndoMaterialDeduct%]";
break;
}
//
strDetail = fuMaterialDeductDataToDetailContent(MTLDeductTemp, cnnTemp);
if (!strDetail.StartsWith(" 0)
{
strResponse = Strings.Mid(strResponse, 1, Strings.Len(strResponse) - 1);
}
}
dsTemp.Dispose();
//Return success
funWIPMaterialDeductData_TPICDRet = "success;" + strResponse + ";";
}
catch (Exception ex)
{
funWIPMaterialDeductData_TPICDRet = CombineFailMsg("0000-999999", ex.Message);
string argstrException1 = null;
modAutoRunLibrary.addTransactionLog_ErrorCode(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "MES", "WIPMaterialDeductData_TPICD", Environment.MachineName, "AutoRun", arriveTime.ToString("yyyy/MM/dd HH:mm:ss"), "fail", responseValue, "createasft5icd2", LogClass: "AutoRun", strException: argstrException1);
}
finally
{
try
{
if (funWIPMaterialDeductData_TPICDRet.ToString().Substring(0, 7) != "success")
{
if (dsTemp.Tables["MTLDeduct"] == null)
{
//未取出dsTemp.Tables["MTLDeduct"]表示非處理資料產生的錯誤, 以Mail內文的方式寄出
string argFileName = "N/A";
string argEmailSubject = "[AUT]" + TranslateMsg("[%FAILEDMATERIALDEDUCTCONTENTTOERP%]", strLanguageMode, strResourceDir) + "。";
string argEmailBody = Conversions.ToString(funWIPMaterialDeductData_TPICDRet);
modAutoRunLibrary.SendMultiEmail(ref argFileName, ref argEmailSubject, argEmailBody, strGroupNo);
}
else
{
//已有取出dsTemp.Tables["MTLDeduct"]表示是處理資料產生的錯誤, 以Excel作為副檔寄送Mail
var dtResult = new DataTable("FailResult");
DataRow drAdd;
dtResult.Columns.Add("WOWorkDate", Type.GetType("System.String")); // 拋轉日期
dtResult.Columns.Add("DeductDate", Type.GetType("System.String")); // 扣料日期
dtResult.Columns.Add("LotSerial", Type.GetType("System.String")); // 生產批序號
dtResult.Columns.Add("LogGroupSerial", Type.GetType("System.String")); // 生產批在作業站的Log序號
dtResult.Columns.Add("DataTypeNo", Type.GetType("System.String")); // 1: 扣料 2:倒扣料
dtResult.Columns.Add("LotNo", Type.GetType("System.String")); // 生產批編號
dtResult.Columns.Add("OPNo", Type.GetType("System.String")); // 作業站編號
dtResult.Columns.Add("EquipmentNo", Type.GetType("System.String")); // 設備編號
dtResult.Columns.Add("MaterialLevel", Type.GetType("System.String")); // 物料等級
dtResult.Columns.Add("MaterialNo", Type.GetType("System.String")); // 物枓編號
dtResult.Columns.Add("MaterialLotNo", Type.GetType("System.String")); // 物枓批號
if (MTLDeductTemp != null)
{
foreach (DataRow drMTLDeduct in MTLDeductTemp.Rows)
{
drAdd = dtResult.NewRow();
drAdd["WOWorkDate"] = arriveTime.ToString("yyyyMMdd");
drAdd["DeductDate"] = Strings.Format(drMTLDeduct["DeductDate"], "yyyy/MM/dd");
drAdd["LotSerial"] = drMTLDeduct["LotSerial"].ToString();
drAdd["LogGroupSerial"] = drMTLDeduct["LogGroupSerial"].ToString();
drAdd["DataTypeNo"] = drMTLDeduct["DataTypeNo"].ToString();
drAdd["LotNo"] = drMTLDeduct["LotNo"].ToString();
drAdd["OPNo"] = drMTLDeduct["OPNo"].ToString();
drAdd["EquipmentNo"] = drMTLDeduct["EquipmentNo"].ToString();
drAdd["MaterialLevel"] = drMTLDeduct["MaterialLevel"].ToString();
drAdd["MaterialNo"] = drMTLDeduct["MaterialNo"].ToString();
drAdd["MaterialLotNo"] = drMTLDeduct["MaterialLotNo"].ToString();
dtResult.Rows.Add(drAdd);
}
}
string strFillType = "XLS";
//var iugTemp = new iMESUltraGrid.iMESUltraGridControl();
//iugTemp.iMESUltraGrid_InitializeLayOut += iMESUltraGrid_InitializeLayOut;
//iugTemp.Identity = "iMES";
//iugTemp.UserNo = "iMES";
//var memStream = new MemoryStream();
//讓最後一列style生效,新增空列
DataRow drEnd = dtResult.NewRow();
dtResult.Rows.Add(drEnd);
var dsResult = new DataSet();
dsResult.Tables.Add(dtResult);
//iugTemp.iMESUltraGrid.DataSource = dtResult;
// 0133391: [跨平台]AutoRunLib移除iMESUltraGrid的使用, 2023/4/21
String ExcelMode = strFillType.ToString().ToUpper(); //"XLSX" , "XLS"
byte[] membyte = modAutoRunLibrary.funExcelToByte(dsResult, ExcelMode, strLanguageMode, strResourceDir);
//var memStream = new MemoryStream(membyte);
//memStream.Seek(0L, SeekOrigin.Begin);
//// 將欄位翻譯
//if (!string.IsNullOrEmpty(modWIN.gLanguageMode))
//{
// var ColSaveControl = new Collection();
// ColSaveControl.Add(iugTemp.iMESUltraGrid);
// //ChgTranslateName(ColSaveControl, modWIN.gLanguageMode);
//}
//switch (strFillType.ToString().ToUpper() ?? "")
//{
// case "XLS":
// {
// // 匯出Excel再轉Stream
// workbook = ExcelExp.Export(iugTemp.iMESUltraGrid); // iugTemp.iMESUltraGrid, Infragistics.Documents.Excel.WorkbookFormat.Excel97To2003
// workbook.Save(memStream);
// memStream.Seek(0L, SeekOrigin.Begin);
// break;
// }
//}
// Stream轉成附件檔
//var AttachFile = new byte[(int)(memStream.Length - 1L + 1)];
//double count = 0d;
//while (count < memStream.Length)
//{
// AttachFile[(int)Math.Round(count)] = Convert.ToByte(memStream.ReadByte());
// count += 1d;
//}
try
{
dsResult.Dispose();
}
catch (Exception ex)
{
}
// 寄送Mail
string argFileName = "ErrorList.xls";
string argEmailSubject = "[AUT]" + TranslateMsg("[%FAILEDMATERIALDEDUCTCONTENTTOERP%]", strLanguageMode, strResourceDir) + "。";
string argEmailBody = Conversions.ToString(funWIPMaterialDeductData_TPICDRet);
modAutoRunLibrary.SendMultiEmail(ref argFileName, ref argEmailSubject, argEmailBody, strGroupNo, membyte);
funWIPMaterialDeductData_TPICDRet = argEmailBody;
}
}
CloseConnection(cnnTemp);
dsTemp.Dispose();
}
catch (Exception ex)
{
funWIPMaterialDeductData_TPICDRet = "fail_Finally;" + ex.Message;
}
}
}
while (false);
return funWIPMaterialDeductData_TPICDRet;
}
private string fuMaterialDeductDataToDetailContent(DataTable MTLDeductData, IDbConnection cnnTemp)
{
string fuMaterialDeductDataToDetailContentRet = defString;
DbDataReader drTemp = default(DbDataReader);
string strSQL = "";
string strTempField = string.Empty;
string strTempRecord = string.Empty;
string strDetail = string.Empty;
try
{
foreach (DataRow drMTLDeduct in MTLDeductData.Rows)
{
strTempField = cbXMLField_TP("status", drMTLDeduct["DataTypeNo"].ToString()); // 1:扣料 2:倒扣料
strTempField += cbXMLField_TP("sfp01", ""); // 填空值
strTempField += cbXMLField_TP("sfp02", Strings.Format(drMTLDeduct["DeductDate"], "yyyy/MM/dd")); // 扣料日期
strTempField += cbXMLField_TP("sfp16", "MES"); // 申請人, 固定填MES
if (!(drMTLDeduct["MONo"] is DBNull))
{
strTempField += cbXMLField_TP("sfs03", drMTLDeduct["MONo"].ToString()); // 工單編號
}
else
{
strSQL = "Select A.MONo From tblWIPLotBasis A, tblWIPLotState B Where A.BaseLotNo = B.BaseLotNo And B.LotNo = '" + drMTLDeduct["LotNo"].ToString() + "'";
drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp);
if (drTemp.Read())
{
strTempField += cbXMLField_TP("sfs03", drTemp["MONo"].ToString()); // 工單編號
}
else
{
fuMaterialDeductDataToDetailContentRet = TranslateMsg("[%LotNo%] :" + drMTLDeduct["LotNo"].ToString() + ",[%MONONOTEXIST%]", strLanguageMode, strResourceDir);
return fuMaterialDeductDataToDetailContentRet;
}
drTemp.Close();
}
if (drMTLDeduct["MaterialLevel"].ToString() == "0")
{
strSQL = "Select ERPNo From tblMTLMaterialBasis Where IssueState = 2 And MaterialNo = '" + drMTLDeduct["MaterialNo"].ToString() + "'";
}
else
{
strSQL = "Select ERPNo From tblPRDProductBasis Where IssueState = 2 And Curversion = 1 And ProductNo = '" + drMTLDeduct["MaterialNo"].ToString() + "'";
}
drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp);
if (drTemp.Read())
{
if (drTemp["ERPNo"].ToString() != "")
{
strTempField += cbXMLField_TP("sfs04", drTemp["ERPNo"].ToString()); // 物料/半成品在ERP的編號
}
else
{
strTempField += cbXMLField_TP("sfs04", drMTLDeduct["MaterialNo"].ToString()); // 物料/半成品在ERP的編號, 若ERPNo沒有值, 則拋MaterialNo
}
}
else
{
fuMaterialDeductDataToDetailContentRet = TranslateMsg("[%MaterialNo%] :" + drMTLDeduct["MaterialNo"].ToString() + " [%IS NOT EXIST%]", strLanguageMode, strResourceDir);
return fuMaterialDeductDataToDetailContentRet;
}
drTemp.Close();
strTempField += cbXMLField_TP("sfs07", drMTLDeduct["PutinPlaceNo"].ToString()); // 扣料點編號 PutinPlaceNo
if (drMTLDeduct["LocatorNo"].ToString() == "N/A")
{
strTempField += cbXMLField_TP("sfs08", ""); // 儲位, 若為N/A則拋空白
}
else
{
strTempField += cbXMLField_TP("sfs08", drMTLDeduct["LocatorNo"].ToString()); // 儲位
}
strTempField += cbXMLField_TP("sfs09", drMTLDeduct["MaterialLotNo"].ToString()); // 物料批號
//2023/10/20,Ning,148374: IC一体化测试
strTempField += cbXMLField_TP("sfs10", drMTLDeduct["OPNo"].ToString()); // 作業站編號
if (drMTLDeduct["MaterialLevel"].ToString() == "0")
{
strSQL = "Select A.UnitNo, B.DefaultValue From tblMTLMaterialBasis A Left Join tblMTLMaterialProperty B On A.MaterialNo = B.Material And B.IssueState = 2 And Upper(B.PropertyNo) = 'ERPUNITNO'" +
" Where A.IssueState = 2 And A.MaterialNo = '" + drMTLDeduct["MaterialNo"].ToString() + "'";
}
else
{
strSQL = "Select A.UnitNo, B.DefaultValue From tblPRDProductBasis A Left Join tblPRDProductProperty B On A.ProductNo = B.ProductNo And A.ProductVersion = B.ProductVersion And B.IssueState = 2 And Upper(B.PropertyNo) = 'ERPUNITNO'" +
" Where A.IssueState = 2 And A.CurVersion = 1 And A.ProductNo = '" + drMTLDeduct["MaterialNo"].ToString() + "'";
}
drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp);
if (drTemp.Read())
{
if (drTemp["DefaultValue"].ToString() != "")
{
strTempField += cbXMLField_TP("sfs30", drTemp["DefaultValue"].ToString()); // 取物料屬性ERPUnitNo 的屬性值
}
else
{
strTempField += cbXMLField_TP("sfs30", drTemp["UnitNo"].ToString()); // 物料屬性值為空, 則物料主檔的UnitNo
}
}
else
{
fuMaterialDeductDataToDetailContentRet = TranslateMsg("[%MaterialNo%] :" + drMTLDeduct["MaterialNo"].ToString() + " [%IS NOT EXIST%]", strLanguageMode, strResourceDir);
return fuMaterialDeductDataToDetailContentRet;
}
drTemp.Close();
strTempField += cbXMLField_TP("sfs05", drMTLDeduct["DeductQty"].ToString()); //扣料數量(DeductQty)
strTempField += cbXMLField_TP("sfsiicd028", ""); //DateCode,填空值
strTempField += cbXMLField_TP("idb05", ""); //刻號,填空值
strTempField += cbXMLField_TP("idb06", ""); //Bin,填空值
strTempField += cbXMLField_TP("idb11", ""); //數量,填空值
strTempField += cbXMLField_TP("idb16", ""); //die數,填空值
strTempRecord += cbXMLRecord_TP(strTempField) + '\n';
}
strDetail = cbXMLDetail_TP("sfs_file", strTempRecord);
}
catch (Exception ex)
{
throw;
}
return strDetail;
}
private Boolean fuMaterialDeductDataThrowTPICD(string InXml, DataTable MTLDeductData, ref string responseValue, ref string description, ref DateTime arriveTime)
{
Boolean fuMaterialDeductDataThrowTPICDRet = false;
string OutXml = "";
var XmlDoc = new XmlDocument();
string code = string.Empty; // Response... code:錯誤碼;非0則為錯誤 (function回傳 success 或 fail)
string sqlcode = string.Empty;
string responseName = "rva01str";
string strSQL = "";
var CollectionSQL = new Collection();
try
{
arriveTime = DateTime.Now;
responseValue = string.Empty;
description = string.Empty;
// ----- Call ERP Web Service -----
using (var ws = new wsERP_TP.TIPTOPServiceGateWay())
{
ws.Url = gERPWSURL;
OutXml = ws.createasft5icd2(InXml);
}
XmlDoc.LoadXml(OutXml);
// ----- 取得ERP執行結果 code, sqlcode, description -----
chkExecutionStatus_TP(XmlDoc, ref code, ref sqlcode, ref description);
//2023/08/08,Lena, ERP 回拋的格式變更同TP
// ----- 取得收貨單號(起始單號~截止單號) -----
//chkResponseContent_TPICD(XmlDoc, responseName, ref responseValue);
chkResponseContent_TP(XmlDoc, responseName, ref responseValue);
if (string.IsNullOrEmpty(code) == true)
{
code = "fail";
}
else if (code == "0")
code = "success";
else
code = "fail";
// Edison 2019/03/22 修正log紀錄位置
string argstrException1 = null;
modAutoRunLibrary.addTransactionLog_ErrorCode(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "MES", "WIPMaterialDeductData_TPICD", Environment.MachineName, "AutoRun", arriveTime.ToString("yyyy/MM/dd HH:mm:ss"), code, responseValue, "createasft5icd2", LogClass: "AutoRun", strException: argstrException1);
if (code == "success")
{
foreach (DataRow drMTLDeduct in MTLDeductData.Rows)
{
strSQL = "Update tblWIPMaterialDeductContent Set ERPFlag = 'Y', ERPNo = '" + responseValue + "'" +
" Where LotSerial = '" + drMTLDeduct["LotSerial"].ToString() + "' And LogGroupSerial = '" + drMTLDeduct["LogGroupSerial"].ToString() + "'" +
" And DataTypeNo = " + drMTLDeduct["DataTypeNo"] + " And EquipmentNo = '" + drMTLDeduct["EquipmentNo"].ToString() + "'" +
" And MaterialLevel = " + drMTLDeduct["MaterialLevel"] + " And MaterialNo = '" + drMTLDeduct["MaterialNo"].ToString() + "' And MaterialLotNo = '" + drMTLDeduct["MaterialLotNo"].ToString() + "'" +
" And PutInPlaceType = " + drMTLDeduct["PutInPlaceType"];
CollectionSQL.Add(strSQL);
}
ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, CollectionSQL);
fuMaterialDeductDataThrowTPICDRet = true;
}
}
catch (Exception ex)
{
fuMaterialDeductDataThrowTPICDRet = false;
throw;
}
return fuMaterialDeductDataThrowTPICDRet;
}
public bool chkResponseContent_TPICD(XmlDocument Xmldoc, string responseName, ref string responseValue)
{
bool chkResponseContent_TPICDRet = default(bool);
try
{
chkResponseContent_TPICDRet = false;
var de = Xmldoc.DocumentElement["ResponseContent"];
if (de == null == true)
return chkResponseContent_TPICDRet;
for (int i = 0, loopTo = de.ChildNodes.Count - 1; i <= loopTo; i++)
{
if (de.ChildNodes.Item(i).Name == "Parameter")
{
for (int j = 0, loopTo1 = de.ChildNodes.Item(i).ChildNodes.Count - 1; j <= loopTo1; j++)
{
if (de.ChildNodes.Item(i).ChildNodes[j].Name == "Field")
{
responseName = de.ChildNodes.Item(i).ChildNodes[j].Attributes["name"].Value;
responseValue = de.ChildNodes.Item(i).ChildNodes[j].Attributes["value"].Value;
}
}
}
}
chkResponseContent_TPICDRet = true;
}
catch (Exception ex)
{
chkResponseContent_TPICDRet = false;
}
return chkResponseContent_TPICDRet;
}
public string cbXMLParameter_TPICD(string strRecord)
{
string cbXMLParameter_TPICDRet = default(string);
cbXMLParameter_TPICDRet = "" + '\n';
cbXMLParameter_TPICDRet += strRecord + '\n';
return cbXMLParameter_TPICDRet;
}
public string cbXMLRecord_TPICD(string strField)
{
string cbXMLRecord_TPICDRet = default(string);
cbXMLRecord_TPICDRet = "" + '\n';
cbXMLRecord_TPICDRet += strField;
return cbXMLRecord_TPICDRet;
}
public string cbXMLRequest_TPICD(string strAccess, string strParameter, string strMaster, string strDetail)
{
string cbXMLRequest_TPICDRet = default(string);
cbXMLRequest_TPICDRet = "" + '\n';
cbXMLRequest_TPICDRet += strAccess + '\n';
cbXMLRequest_TPICDRet += "" + '\n';
cbXMLRequest_TPICDRet += strParameter + '\n';
cbXMLRequest_TPICDRet += "" + '\n';
cbXMLRequest_TPICDRet += "" + '\n';
cbXMLRequest_TPICDRet += strMaster + '\n';
cbXMLRequest_TPICDRet += strDetail + '\n';
cbXMLRequest_TPICDRet += "" + '\n';
cbXMLRequest_TPICDRet += "" + '\n';
cbXMLRequest_TPICDRet += "" + '\n';
cbXMLRequest_TPICDRet += "" + '\n';
cbXMLRequest_TPICDRet += "" + '\n';
cbXMLRequest_TPICDRet += "";
return cbXMLRequest_TPICDRet;
}
#endregion
#region ---工單用料回拋E10 ICD---
private object funWIPMaterialDeductData_E10ICD(Collection colParameters = null)
{
object funWIPMaterialDeductData_E10ICDRet = default(object);
var cnnTemp = default(IDbConnection);
string strSQL;
string strOPGroupError = defString;
string strCDOError = defString;
string RequestKey = "";
string strGroupNo = string.Empty; //Mail通知群組
string strRowCount = "500"; //拋轉ERP筆數
string strMaterialOut = string.Empty; //領料單單別
string strMaterialReturn = string.Empty; //退料單單別
var arriveTime = DateTime.Now;
string description = string.Empty; // Response... 錯誤訊息
string responseValue = string.Empty; // Request/Response... 退料單號, 成功回傳ERP退料單號
var aryReturnMessage = new ArrayList(); // Catch Error Message (Exception及MES判定錯誤訊息)。
var dsTemp = new DataSet();
DataTable MTLDeductTemp = null;
DataRow[] OPGroupMTLDeduct = null;
do
{
try
{
cnnTemp = CreateConnection(strConnectionString);
//Parameter01:使用者群組,此功能fail時EMAIL通知群組。
//Parameter02:拋轉ERP筆數,一次拋給 ERP 的生產批報工用料筆數,預設500筆。
//Parameter03:ERP的領料單單別。
//Parameter04:ERP的退料單單別。
// Parameter01:使用者群組, 可以不設定
if (!(colParameters["Parameter01"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter01"]))))
{
strGroupNo = colParameters["Parameter01"].ToString().Trim();
//若有設定, 先檢查群組合理性
if (!string.IsNullOrEmpty(strGroupNo) && ERP2MES_MailNoticeChk(ref cnnTemp, ref aryReturnMessage, strGroupNo) < 0)
{
funWIPMaterialDeductData_E10ICDRet = Conversions.ToString("fail;" + aryReturnMessage[0]);
return funWIPMaterialDeductData_E10ICDRet; // 離開 Function。
}
}
// Parameter02:拋轉ERP筆數必須為數值型態
if (Information.IsNumeric(colParameters["Parameter02"]))
{
if (!(colParameters["Parameter02"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter02"]))))
{
strRowCount = colParameters["Parameter02"].ToString().Trim();
}
}
// Parameter03:ERP的領料單單別,若未設定參數值,則回拋錯誤並結束此次作業
if (!(colParameters["Parameter03"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter03"]))))
{
strMaterialOut = colParameters["Parameter03"].ToString().Trim();
}
else
{
funWIPMaterialDeductData_E10ICDRet = TranslateMsg("[%MATERIALOUTSHEETTYPE%][%NOT SET%]!!", strLanguageMode, strResourceDir);
return funWIPMaterialDeductData_E10ICDRet;
}
// Parameter04:ERP的退料單單別,若未設定參數值,則回拋錯誤並結束此次作業
if (!(colParameters["Parameter04"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter04"]))))
{
strMaterialReturn = colParameters["Parameter04"].ToString().Trim();
}
else
{
funWIPMaterialDeductData_E10ICDRet = TranslateMsg("[%MATERIALRETURNSHEETTYPE%][%NOT SET%]!!", strLanguageMode, strResourceDir);
return funWIPMaterialDeductData_E10ICDRet;
}
// ---- InXml -----
// 取得ERP資訊
try
{
if (!GetERPSetting(ref dtERPSetting, "E10ICD", pEAIType: 1, pActiveERP: 1))
{
if (!GetERPSetting(ref dtERPSetting, "E10ICD", pEAIType: 1))
{
funWIPMaterialDeductData_E10ICDRet = TranslateMsg("[%ERPWSURL%][%not found%]!", strLanguageMode, strResourceDir);
return funWIPMaterialDeductData_E10ICDRet;
}
}
}
catch (Exception ex)
{
if (!GetERPSetting(ref dtERPSetting, "E10ICD", pEAIType: 1))
{
funWIPMaterialDeductData_E10ICDRet = TranslateMsg("[%ERPWSURL%][%not found%]!", strLanguageMode, strResourceDir);
return funWIPMaterialDeductData_E10ICDRet;
}
}
// 2023/08/09,Lena, 調整為只取2和4的用料拋 ERP
if (strDataBaseType != "oracle")
{
strSQL = "Select TOP " + Conversions.ToInteger(strRowCount) + " * From tblWIPMaterialDeductContent Where ERPFlag = 'N' and PutInPlaceType in (2,4) Order By DeductDate";
}
else
{
strSQL = "Select A.* From (Select * From tblWIPMaterialDeductContent Where ERPFlag = 'N' and PutInPlaceType in (2,4) Order By DeductDate) A Where RowNum <= " + Conversions.ToInteger(strRowCount);
}
ExecuteSQLQuery_Adapter(strSQL, dsTemp, "MTLDeduct", cnnTemp);
//目前的ERP Response
string strResponse = "";
if (dsTemp.Tables["MTLDeduct"].Rows.Count > 0)
{
arriveTime = DateTime.Now;
MTLDeductTemp = dsTemp.Tables["MTLDeduct"].Clone();
//進行中的DataTypeNo
int stateType = Conversions.ToInteger(dsTemp.Tables["MTLDeduct"].Rows[0]["DataTypeNo"]);
for (int i = 0; i < dsTemp.Tables["MTLDeduct"].Rows.Count; i++)
{
DataRow drAdd = MTLDeductTemp.NewRow();
foreach (DataColumn dc in MTLDeductTemp.Columns)
{
drAdd[dc.ColumnName] = dsTemp.Tables["MTLDeduct"].Rows[i][dc.ColumnName];
}
MTLDeductTemp.Rows.Add(drAdd);
//沒有下一筆 或 下一筆與本筆DataTypeNo不相符,進行組成XML拋ERP
if (i + 1 == dsTemp.Tables["MTLDeduct"].Rows.Count ||
Conversions.ToInteger(dsTemp.Tables["MTLDeduct"].Rows[i + 1]["DataTypeNo"]) != stateType)
{
if (MTLDeductTemp != null && MTLDeductTemp.Rows.Count > 0)
{
int DataTypeNo = Conversions.ToInteger(dsTemp.Tables["MTLDeduct"].Rows[i]["DataTypeNo"]);
string SheetType = "";
string strErrorDataType = "";
switch (DataTypeNo)
{
case 1: //1:物料扣料
SheetType = strMaterialOut; //領料單單別
strErrorDataType = "[%MaterialDeduct%]";
break;
case 2: //2:還原物料扣料
SheetType = strMaterialReturn; //退料單單別
strErrorDataType = "[%UndoMaterialDeduct%]";
break;
}
//得到作業站群組
HashSet OPGroupHs = new HashSet();
DataTable OPGroupMTLDeductTemp = MTLDeductTemp.Copy();
strOPGroupError = fuGetOPGroupNoAndOPGroups(ref OPGroupHs, ref OPGroupMTLDeductTemp, cnnTemp);
if (strOPGroupError != defString)
{
funWIPMaterialDeductData_E10ICDRet = TranslateMsg(strErrorDataType + strOPGroupError, strLanguageMode, strResourceDir);
return funWIPMaterialDeductData_E10ICDRet;
}
foreach (string OPGroupNo in OPGroupHs)
{
//作業站群組的用料
OPGroupMTLDeduct = OPGroupMTLDeductTemp.Select("OPGroupNo= '" + OPGroupNo + "'");
if (OPGroupMTLDeduct != null && OPGroupMTLDeduct.Length > 0)
{
// CDO object
var objERPrequest = new iMESCIO.SCI.ERP.Request_E10ICD.SCI_Request_issue_wo_inverted();
strCDOError = fuMaterialDeductDataToCDOobject(DataTypeNo, SheetType, OPGroupNo, OPGroupMTLDeduct, ref objERPrequest, ref arriveTime, cnnTemp);
if (strCDOError != defString)
{
funWIPMaterialDeductData_E10ICDRet = TranslateMsg(strErrorDataType + strCDOError, strLanguageMode, strResourceDir);
return funWIPMaterialDeductData_E10ICDRet;
}
object argCDO_Object = objERPrequest;
InXml = "";
InXml = CombineRequestXMLbyCDO(ref argCDO_Object, dtERPSetting.Rows[0]["ERP_Name"].ToString(), "", "issue.wo.inverted.e10icd", pRequestKey: RequestKey);
objERPrequest = (iMESCIO.SCI.ERP.Request_E10ICD.SCI_Request_issue_wo_inverted)argCDO_Object;
// ----- Call ERP Web Service -----
if (!fuMaterialDeductDataThrowE10ICD(InXml, OPGroupMTLDeduct, ref responseValue, ref description, ref arriveTime))
{
funWIPMaterialDeductData_E10ICDRet = TranslateMsg("fail;" + strErrorDataType + " [%ERP Return Message%]:" + description, strLanguageMode, strResourceDir);
return funWIPMaterialDeductData_E10ICDRet;
}
else
{
//ERP成功單號
strResponse += responseValue + ",";
}
//清除已拋ERP扣料資料
OPGroupMTLDeduct = null;
}
}
if (i + 1 != dsTemp.Tables["MTLDeduct"].Rows.Count)
{
//更新進行中的DataTypeNo
stateType = Conversions.ToInteger(dsTemp.Tables["MTLDeduct"].Rows[i + 1]["DataTypeNo"]);
}
//清除已拋ERP扣料資料
MTLDeductTemp.Clear();
}
}
}
if (strResponse.Length > 0)
{
strResponse = Strings.Mid(strResponse, 1, Strings.Len(strResponse) - 1);
}
}
dsTemp.Dispose();
//Return success
funWIPMaterialDeductData_E10ICDRet = "success;" + strResponse + ";";
}
catch (Exception ex)
{
funWIPMaterialDeductData_E10ICDRet = CombineFailMsg("0000-999999", ex.Message);
string argstrException1 = null;
modAutoRunLibrary.addTransactionLog_ErrorCode(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "MES", "WIPMaterialDeductData_E10ICD", Environment.MachineName, "AutoRun", arriveTime.ToString("yyyy/MM/dd HH:mm:ss"), "fail", responseValue, "issue.wo.inverted.e10icd", LogClass: "AutoRun", strException: argstrException1);
}
finally
{
try
{
if (funWIPMaterialDeductData_E10ICDRet.ToString().Substring(0, 7) != "success")
{
if (dsTemp.Tables["MTLDeduct"] == null)
{
//未取出dsTemp.Tables["MTLDeduct"]表示非處理資料產生的錯誤, 以Mail內文的方式寄出
string argFileName = "N/A";
string argEmailSubject = "[AUT]"+ TranslateMsg("[%FAILEDMATERIALDEDUCTCONTENTTOERP%]", strLanguageMode, strResourceDir)+"。";
string argEmailBody = Conversions.ToString(funWIPMaterialDeductData_E10ICDRet);
modAutoRunLibrary.SendMultiEmail(ref argFileName, ref argEmailSubject, argEmailBody, strGroupNo);
}
else
{
//已有取出dsTemp.Tables["MTLDeduct"]表示是處理資料產生的錯誤, 以Excel作為副檔寄送Mail
var dtResult = new DataTable("FailResult");
DataRow drAdd;
dtResult.Columns.Add("WOWorkDate", Type.GetType("System.String")); // 拋轉日期
dtResult.Columns.Add("DeductDate", Type.GetType("System.String")); // 扣料日期
dtResult.Columns.Add("LotSerial", Type.GetType("System.String")); // 生產批序號
dtResult.Columns.Add("LogGroupSerial", Type.GetType("System.String")); // 生產批在作業站的Log序號
dtResult.Columns.Add("DataTypeNo", Type.GetType("System.String")); // 1: 扣料 2:倒扣料
dtResult.Columns.Add("LotNo", Type.GetType("System.String")); // 生產批編號
dtResult.Columns.Add("OPNo", Type.GetType("System.String")); // 作業站編號
dtResult.Columns.Add("EquipmentNo", Type.GetType("System.String")); // 設備編號
dtResult.Columns.Add("MaterialLevel", Type.GetType("System.String")); // 物料等級
dtResult.Columns.Add("MaterialNo", Type.GetType("System.String")); // 物枓編號
dtResult.Columns.Add("MaterialLotNo", Type.GetType("System.String")); // 物枓批號
DataRow[] MTLDataTemp = null;
if (OPGroupMTLDeduct != null)
{
MTLDataTemp = OPGroupMTLDeduct;
}
else if (MTLDeductTemp != null)
{
MTLDataTemp = MTLDeductTemp.Select();
}
else
{
MTLDataTemp = dsTemp.Tables["MTLDeduct"].Select();
}
if (MTLDataTemp != null)
{
foreach (DataRow drMTLDeduct in MTLDataTemp)
{
drAdd = dtResult.NewRow();
drAdd["WOWorkDate"] = arriveTime.ToString("yyyyMMdd");
drAdd["DeductDate"] = Strings.Format(drMTLDeduct["DeductDate"], "yyyy/MM/dd");
drAdd["LotSerial"] = drMTLDeduct["LotSerial"].ToString();
drAdd["LogGroupSerial"] = drMTLDeduct["LogGroupSerial"].ToString();
drAdd["DataTypeNo"] = drMTLDeduct["DataTypeNo"].ToString();
drAdd["LotNo"] = drMTLDeduct["LotNo"].ToString();
drAdd["OPNo"] = drMTLDeduct["OPNo"].ToString();
drAdd["EquipmentNo"] = drMTLDeduct["EquipmentNo"].ToString();
drAdd["MaterialLevel"] = drMTLDeduct["MaterialLevel"].ToString();
drAdd["MaterialNo"] = drMTLDeduct["MaterialNo"].ToString();
drAdd["MaterialLotNo"] = drMTLDeduct["MaterialLotNo"].ToString();
dtResult.Rows.Add(drAdd);
}
}
string strFillType = "XLS";
//讓最後一列style生效,新增空列
DataRow drEnd = dtResult.NewRow();
dtResult.Rows.Add(drEnd);
var dsResult = new DataSet();
dsResult.Tables.Add(dtResult);
// 0133391: [跨平台]AutoRunLib移除iMESUltraGrid的使用, 2023/4/21
String ExcelMode = strFillType.ToString().ToUpper(); //"XLSX" , "XLS"
byte[] membyte = modAutoRunLibrary.funExcelToByte(dsResult, ExcelMode, strLanguageMode, strResourceDir);
try
{
dsResult.Dispose();
}
catch (Exception ex)
{
}
// 寄送Mail
string argFileName = "ErrorList.xls";
string argEmailSubject = "[AUT]"+ TranslateMsg("[%FAILEDMATERIALDEDUCTCONTENTTOERP%]", strLanguageMode, strResourceDir) + "。";
string argEmailBody = Conversions.ToString(funWIPMaterialDeductData_E10ICDRet);
modAutoRunLibrary.SendMultiEmail(ref argFileName, ref argEmailSubject, argEmailBody, strGroupNo, membyte);
funWIPMaterialDeductData_E10ICDRet = argEmailBody;
}
}
CloseConnection(cnnTemp);
dsTemp.Dispose();
}
catch (Exception ex)
{
funWIPMaterialDeductData_E10ICDRet = "fail_Finally;" + ex.Message;
}
}
}
while (false);
return funWIPMaterialDeductData_E10ICDRet;
}
private string fuGetOPGroupNoAndOPGroups(ref HashSet OPGroupHs, ref DataTable MTLDeductDataTemp, IDbConnection cnnTemp)
{
string fuGetOPGroupNoAndOPGroupsRet = defString;
DbDataReader drTemp = default(DbDataReader);
string strSQL = "";
try
{
if (!MTLDeductDataTemp.Columns.Contains("OPGroupNo"))
{
MTLDeductDataTemp.Columns.Add("OPGroupNo", Type.GetType("System.String")); //作業站群組
}
foreach (DataRow drMTLDeduct in MTLDeductDataTemp.Rows)
{
strSQL = "Select OPGroupNo,OPNo From tblOPGroupDetail Where OPNo = '" + drMTLDeduct["OPNo"] + "'";
drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp);
if (drTemp.Read())
{
drMTLDeduct["OPGroupNo"] = drTemp["OPGroupNo"].ToString();
OPGroupHs.Add(drTemp["OPGroupNo"].ToString());
}
else
{
fuGetOPGroupNoAndOPGroupsRet = TranslateMsg("[%OPNo%] :" + drMTLDeduct["OPNo"].ToString() + ",[%OPGROUPNO%][%IS NOT EXIST%]", strLanguageMode, strResourceDir);
return fuGetOPGroupNoAndOPGroupsRet;
}
drTemp.Close();
}
}
catch (Exception ex)
{
throw;
}
return fuGetOPGroupNoAndOPGroupsRet;
}
private string fuMaterialDeductDataToCDOobject(int DataTypeNo, string SheetType, string OPGroupNo, DataRow[] OPGroupMTLDeduct, ref iMESCIO.SCI.ERP.Request_E10ICD.SCI_Request_issue_wo_inverted objERPrequest, ref DateTime arriveTime, IDbConnection cnnTemp)
{
string fuMaterialDeductDataToCDOobjectRet = defString;
DbDataReader drTemp = default(DbDataReader);
string strSQL = "";
var objERPrequest_Detail = new List();
try
{
arriveTime = DateTime.Now;
//Master
objERPrequest.doc_type_no = SheetType; //單別
objERPrequest.doc_no = ""; //單據編號,填空值
objERPrequest.create_date = Strings.Format(arriveTime, "yyyyMMdd"); //單據時間,目前時間
//DataTypeNo= 1:物料扣料,2:還原物料扣料
objERPrequest.status = (DataTypeNo == 2) ? "3" : Conversions.ToString(DataTypeNo); //1:扣料(發料)、3:倒扣料(退料)
objERPrequest.remark = ""; //備註,填空值
objERPrequest.applicant_no = ""; //領退料人員,填空值
objERPrequest.workstation_no = OPGroupNo; //作業站群組
//Detail
for (int i = 0; i < OPGroupMTLDeduct.Length; i++)
{
var objDetail = new iMESCIO.SCI.ERP.Request_E10ICD.SCI_detail_issue_wo_inverted();
objDetail.seq = Conversions.ToString(i + 1); //序號,從1開始的流水號
//工單編號
if (!(OPGroupMTLDeduct[i]["MONo"] is DBNull))
{
objDetail.wo_no = OPGroupMTLDeduct[i]["MONo"].ToString(); //工單單號
}
else
{
strSQL = "Select A.MONo From tblWIPLotBasis A, tblWIPLotState B Where A.BaseLotNo = B.BaseLotNo And B.LotNo = '" + OPGroupMTLDeduct[i]["LotNo"].ToString() + "'";
drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp);
if (drTemp.Read())
{
objDetail.wo_no = drTemp["MONo"].ToString(); // 工單編號
}
else
{
fuMaterialDeductDataToCDOobjectRet = TranslateMsg("[%LotNo%] :" + OPGroupMTLDeduct[i]["LotNo"].ToString() + ",[%MONONOTEXIST%]", strLanguageMode, strResourceDir);
return fuMaterialDeductDataToCDOobjectRet;
}
drTemp.Close();
}
//物料編號
if (OPGroupMTLDeduct[i]["MaterialLevel"].ToString() == "0")
{
strSQL = "Select ERPNo From tblMTLMaterialBasis Where IssueState = 2 And MaterialNo = '" + OPGroupMTLDeduct[i]["MaterialNo"].ToString() + "'";
}
else
{
strSQL = "Select ERPNo From tblPRDProductBasis Where IssueState = 2 And Curversion = 1 And ProductNo = '" + OPGroupMTLDeduct[i]["MaterialNo"].ToString() + "'";
}
drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp);
if (drTemp.Read())
{
if (drTemp["ERPNo"].ToString() != "")
{
objDetail.item_no = drTemp["ERPNo"].ToString(); //物料/半成品在ERP的編號
}
else
{
objDetail.item_no = OPGroupMTLDeduct[i]["MaterialNo"].ToString(); //物料/半成品在ERP的編號,若ERPNo沒有值,則拋MaterialNo
}
}
else
{
fuMaterialDeductDataToCDOobjectRet = TranslateMsg("[%MaterialNo%] :" + OPGroupMTLDeduct[i]["MaterialNo"].ToString() + " [%IS NOT EXIST%]", strLanguageMode, strResourceDir);
return fuMaterialDeductDataToCDOobjectRet;
}
drTemp.Close();
objDetail.qty = OPGroupMTLDeduct[i]["DeductQty"].ToString(); //扣料數量
//物料單位
if (OPGroupMTLDeduct[i]["MaterialLevel"].ToString() == "0")
{
strSQL = "Select A.UnitNo, B.DefaultValue From tblMTLMaterialBasis A Left Join tblMTLMaterialProperty B On A.MaterialNo = B.Material And B.IssueState = 2 And Upper(B.PropertyNo) = 'ERPUNITNO'" +
" Where A.IssueState = 2 And A.MaterialNo = '" + OPGroupMTLDeduct[i]["MaterialNo"].ToString() + "'";
}
else
{
strSQL = "Select A.UnitNo, B.DefaultValue From tblPRDProductBasis A Left Join tblPRDProductProperty B On A.ProductNo = B.ProductNo And A.ProductVersion = B.ProductVersion And B.IssueState = 2 And Upper(B.PropertyNo) = 'ERPUNITNO'" +
" Where A.IssueState = 2 And A.CurVersion = 1 And A.ProductNo = '" + OPGroupMTLDeduct[i]["MaterialNo"].ToString() + "'";
}
drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp);
if (drTemp.Read())
{
if (drTemp["DefaultValue"].ToString() != "")
{
objDetail.unit_no = drTemp["DefaultValue"].ToString(); //取物料屬性ERPUnitNo 的屬性值
}
else
{
objDetail.unit_no = drTemp["UnitNo"].ToString(); //物料屬性值為空,則物料主檔的UnitNo
}
}
else
{
fuMaterialDeductDataToCDOobjectRet = TranslateMsg("[%MaterialNo%] :" + OPGroupMTLDeduct[i]["MaterialNo"].ToString() + " [%IS NOT EXIST%]", strLanguageMode, strResourceDir);
return fuMaterialDeductDataToCDOobjectRet;
}
drTemp.Close();
objDetail.item_type = ""; //物料等級,填空值
objDetail.input_datetime = Strings.Format(OPGroupMTLDeduct[i]["DeductDate"], "yyyyMMdd"); //扣料日期
objDetail.warehouse_no = OPGroupMTLDeduct[i]["PutinPlaceNo"].ToString(); //扣料點編號
//儲位
if (OPGroupMTLDeduct[i]["LocatorNo"].ToString() == "N/A")
{
objDetail.location_no = ""; //儲位,若為N/A則拋空白
}
else
{
objDetail.location_no = OPGroupMTLDeduct[i]["LocatorNo"].ToString(); //儲位
}
objDetail.lot_no = OPGroupMTLDeduct[i]["MaterialLotNo"].ToString(); //物料批號
objDetail.expiry_date = ""; //有效日期,填空值
objDetail.item_feature_no = ""; //物徵碼,填空值
objDetail.remark = ""; //備註,填空值
objDetail.positive_negative = ""; //正負,填空值
objDetail.replaced_item_no = ""; //被替代的物料編號,若未傳入則以物料編號為默認值,填空值
objDetail.replaced_qty = ""; //被替代的物料數量,填空值
objDetail.replaced_type = ""; //替代料等級,填空值
objDetail.issue_to_type = "3"; //3:MO (工單,Default)
objDetail.sub_type = "0"; //0:主料 1:取代 2:替代
objDetail.replaced_item_feature_no = ""; //替代品號特徵碼,填空值
objDetail.op_no = OPGroupMTLDeduct[i]["OPNo"].ToString(); //作業站編號
objERPrequest_Detail.Add(objDetail);
}
objERPrequest.wo_item_detail = objERPrequest_Detail;
}
catch (Exception ex)
{
throw;
}
return fuMaterialDeductDataToCDOobjectRet;
}
private Boolean fuMaterialDeductDataThrowE10ICD(string InXml, DataRow[] OPGroupMTLDeduct, ref string responseValue, ref string description, ref DateTime arriveTime)
{
Boolean fuMaterialDeductDataThrowE10ICDRet = false;
string OutXml = "";
var objERPresponse = new iMESCIO.SCI.ERP.Response_E10ICD.SCI_Response_issue_wo_inverted();
string code = string.Empty; // Response... code:錯誤碼;非0則為錯誤 (function回傳 success 或 fail)
string strSQL = "";
var CollectionSQL = new Collection();
try
{
arriveTime = DateTime.Now;
responseValue = string.Empty;
description = string.Empty;
// ----- Call ERP Web Service -----
using (var ws = new iMESCore.Base.Invoke.wsERP_EAI.IntegrationEntry())
{
ws.Url = ERP_URL;
OutXml = ws.invokeSrv(InXml);
}
objERPresponse.ParseXmlToObject(OutXml);
// ----- 取得ERP執行結果 code,responseValue,description -----
code = objERPresponse.code;
responseValue = objERPresponse.return_no;
description = objERPresponse.description;
if (string.IsNullOrEmpty(code) == true)
{
code = "fail";
}
else if (code == "0")
code = "success";
else
code = "fail";
// Edison 2019/03/22 修正log紀錄位置
string argstrException1 = null;
modAutoRunLibrary.addTransactionLog_ErrorCode(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "MES", "WIPMaterialDeductData_E10ICD", Environment.MachineName, "AutoRun", arriveTime.ToString("yyyy/MM/dd HH:mm:ss"), code, responseValue, "issue.wo.inverted.e10icd", LogClass: "AutoRun", strException: argstrException1);
if (code == "success")
{
foreach (DataRow drMTLDeduct in OPGroupMTLDeduct)
{
strSQL = "Update tblWIPMaterialDeductContent Set ERPFlag = 'Y', ERPNo = '" + responseValue + "'" +
" Where LotSerial = '" + drMTLDeduct["LotSerial"].ToString() + "' And LogGroupSerial = '" + drMTLDeduct["LogGroupSerial"].ToString() + "'" +
" And DataTypeNo = " + drMTLDeduct["DataTypeNo"] + " And EquipmentNo = '" + drMTLDeduct["EquipmentNo"].ToString() + "'" +
" And MaterialLevel = " + drMTLDeduct["MaterialLevel"] + " And MaterialNo = '" + drMTLDeduct["MaterialNo"].ToString() + "' And MaterialLotNo = '" + drMTLDeduct["MaterialLotNo"].ToString() + "'" +
" And PutInPlaceType = " + drMTLDeduct["PutInPlaceType"];
CollectionSQL.Add(strSQL);
}
ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, CollectionSQL);
fuMaterialDeductDataThrowE10ICDRet = true;
}
}
catch (Exception ex)
{
fuMaterialDeductDataThrowE10ICDRet = false;
throw;
}
return fuMaterialDeductDataThrowE10ICDRet;
}
#endregion
#region 工单自动结单
private object funProcessERPPendingTrans(Collection colParameters = null)
{
object funProcessERPPendingTransRet = default(object);
var cnnTemp = default(IDbConnection);
string strSQL;
string strAccess = string.Empty;
string strParameter = string.Empty;
string strMaster = string.Empty;
string strDetail = string.Empty;
string strTempField = string.Empty;
string strTempRecord = string.Empty;
var arriveTime = DateTime.Now;
string strGroupNo = string.Empty; // Mail通知群組
string strERPName = string.Empty; //设定的ERP名称
string closeMORet = string.Empty; // Request/Response... 收貨單單號, 成功回傳ERP收貨單號起始~截止單號
// 2021/03/30 Elvis 0087678: [瑞賢] AUTORUN報工--報工失敗,發送郵件新增提供失敗清單
//var ExcelExp = new Infragistics.Win.UltraWinGrid.ExcelExport.UltraGridExcelExporter();
//var workbook = new Infragistics.Documents.Excel.Workbook();
var aryReturnMessage = new ArrayList(); // Catch Error Message (Exception及MES判定錯誤訊息)。
var dsTemp = new DataSet();
var datNow = DateTime.Now;
var dtResult = new DataTable("FailResult");
DataRow drAdd;
do
{
try
{
cnnTemp = CreateConnection(strConnectionString);
dtResult.Columns.Add("TransactionID", Type.GetType("System.String")); // 交易編號
dtResult.Columns.Add("TransactionType", Type.GetType("System.String")); // 交易類型
dtResult.Columns.Add("TicketNo", Type.GetType("System.String")); // 單據編號
dtResult.Columns.Add("ERPType", Type.GetType("System.String")); // ERP類型
dtResult.Columns.Add("Creator", Type.GetType("System.String")); // 建立人
dtResult.Columns.Add("CreateDate", Type.GetType("System.String")); // 建立日
dtResult.Columns.Add("FailReason", Type.GetType("System.String")); // 錯誤訊息
// Parameter01為參數一(使用者群組), 可以不設定
if (!(colParameters["Parameter01"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter01"]))))
{
strGroupNo = colParameters["Parameter01"].ToString().Trim();
//若有設定, 先檢查群組合理性
if (!string.IsNullOrEmpty(strGroupNo) && ERP2MES_MailNoticeChk(ref cnnTemp, ref aryReturnMessage, strGroupNo) < 0)
{
funProcessERPPendingTransRet = Conversions.ToString("fail;" + aryReturnMessage[0]);
goto exitfun;
}
}
//查询系统当前设置的ERP系统名称,只有workflow才會執行此自動結單功能
strSQL = "select ERP_NAME from TBLSYSERPSETTING where ACTIVEERP = 1";
ExecuteSQLQuery_Adapter(strSQL, dsTemp, "ERPName", cnnTemp);
if (dsTemp.Tables["ERPName"].Rows.Count > 0)
{
strERPName = dsTemp.Tables["ERPName"].Rows[0]["ERP_NAME"].ToString().Trim();
}
if (strERPName != "Workflow")
{
funProcessERPPendingTransRet = Conversions.ToString("fail;" + TranslateMsg("ERP[%IS NOT%]WorkFlow,[%NOTALLOWTOUSEFUNCTION%]", strLanguageMode, strResourceDir));
goto exitfun;
}
//查询出tblERPPendingTrans表中数据并处理工单结案
strSQL = " select * from tblERPPendingTrans order by CreateDate ";
ExecuteSQLQuery_Adapter(strSQL, dsTemp, "ERPPending", cnnTemp);
for (int i = 0; i < dsTemp.Tables["ERPPending"].Rows.Count; i++)
{
string ERPType = string.Empty;
string transactionType = string.Empty;
ERPType = dsTemp.Tables["ERPPending"].Rows[i]["ERPType"].ToString();
transactionType = dsTemp.Tables["ERPPending"].Rows[i]["TransactionType"].ToString();
if (ERPType == "TP" && transactionType == "1")
{
try
{
closeMORet = funMOPendingClose(dsTemp.Tables["ERPPending"].Rows[i]["TicketNo"].ToString());
}
catch (Exception ex)
{
closeMORet = ex.Message;
}
if (closeMORet != "success")
{
drAdd = dtResult.NewRow();
drAdd["TransactionID"] = dsTemp.Tables["ERPPending"].Rows[i]["TransactionID"].ToString();
drAdd["TransactionType"] = dsTemp.Tables["ERPPending"].Rows[i]["TransactionType"].ToString();
drAdd["TicketNo"] = dsTemp.Tables["ERPPending"].Rows[i]["TicketNo"].ToString();
drAdd["ERPType"] = dsTemp.Tables["ERPPending"].Rows[i]["ERPType"].ToString();
drAdd["Creator"] = dsTemp.Tables["ERPPending"].Rows[i]["Creator"].ToString();
drAdd["CreateDate"] = Strings.Format(dsTemp.Tables["ERPPending"].Rows[i]["CreateDate"], "yyyy/MM/dd HH:mm:ss");
drAdd["FailReason"] = closeMORet;
dtResult.Rows.Add(drAdd);
}
}
}
if (dtResult.Rows.Count > 0)
{
funProcessERPPendingTransRet = "fail;";
foreach (DataRow r in dtResult.Rows)
funProcessERPPendingTransRet += Conversions.ToString(TranslateMsg("[%TransactionID%]: " + r["TransactionID"].ToString() +
", [%TicketNo%]: " + r["TicketNo"].ToString() + ", " +
r["FailReason"].ToString() + "\r\n", strLanguageMode, strResourceDir));
goto exitfun;
}
funProcessERPPendingTransRet = "success";
exitfun:;
}
catch (Exception ex)
{
funProcessERPPendingTransRet = Conversions.ToString("fail;" + ex.Message);
}
finally
{
try
{
if (strGroupNo != string.Empty)
{
if (funProcessERPPendingTransRet.ToString().Substring(0, 7) != "success" || dtResult.Rows.Count > 0)
{
if (dtResult.Rows.Count == 0)
{
//未取出dsTemp.Tables["MTLDeduct"]表示非處理資料產生的錯誤, 以Mail內文的方式寄出
string argFileName = "N/A";
string argEmailSubject = "[AUT]" + TranslateMsg("[%PROCESSINGERPPENDINGTRANSFAIL%]", strLanguageMode, strResourceDir);
string argEmailBody = Conversions.ToString(funProcessERPPendingTransRet);
modAutoRunLibrary.SendMultiEmail(ref argFileName, ref argEmailSubject, argEmailBody, strGroupNo);
}
else
{
//已有取出dsTemp.Tables["MTLDeduct"]表示是處理資料產生的錯誤, 以Excel作為副檔寄送Mail
string strFillType = "XLS";
//讓最後一列style生效,新增空列
DataRow drEnd = dtResult.NewRow();
dtResult.Rows.Add(drEnd);
var dsResult = new DataSet();
dsResult.Tables.Add(dtResult);
//iugTemp.iMESUltraGrid.DataSource = dtResult;
// 0133391: [跨平台]AutoRunLib移除iMESUltraGrid的使用, 2023/4/21
String ExcelMode = strFillType.ToString().ToUpper(); //"XLSX" , "XLS"
byte[] membyte = modAutoRunLibrary.funExcelToByte(dsResult, ExcelMode, strLanguageMode, strResourceDir);
try
{
dsResult.Dispose();
}
catch (Exception ex)
{
}
// 寄送Mail
string argFileName = "ErrorList.xls";
string argEmailSubject = "[AUT]" + TranslateMsg("[%PROCESSINGERPPENDINGTRANSFAIL%]", strLanguageMode, strResourceDir);
string argEmailBody = TranslateMsg("[%SOMEMOAUTOCLOSEFAIL%]", strLanguageMode, strResourceDir);
modAutoRunLibrary.SendMultiEmail(ref argFileName, ref argEmailSubject, argEmailBody, strGroupNo, membyte);
funProcessERPPendingTransRet = argEmailBody;
}
}
}
CloseConnection(cnnTemp);
dsTemp.Dispose();
dtResult.Dispose();
}
catch (Exception ex)
{
funProcessERPPendingTransRet = "fail_Finally;" + ex.Message;
}
}
}
while (false);
return funProcessERPPendingTransRet;
}
// 工單結案
public string funMOPendingClose(string MONo = defString)
{
DbDataReader drTemp = null;
IDbConnection cnnTemp = null;
// Dim cmd As OleDb.OleDbCommand
string strSQL = string.Empty;
string chkMOState_CloseRet = string.Empty;
var CollectionSQL = new Collection();
var CollectionRows = new Collection();
DateTime EventTime = DateTime.Now;
try
{
cnnTemp = CreateConnection(strConnectionString);
//查询工单是否存在
strSQL = "Select MONO,FromERP,IssueState,MOState From tblOEMOBasis Where MONo = '" + MONo + "'";
drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp);
if (drTemp.Read())
{
if (Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(drTemp["IssueState"], 2, false)))
{
chkMOState_CloseRet = TranslateMsg("[%MONONOTAPPROVED%]", strLanguageMode, strResourceDir);
goto exitfun;
}
if (drTemp["MOState"].ToString() == "99")
{
chkMOState_CloseRet = TranslateMsg("[%MONOCLOSED%]", strLanguageMode, strResourceDir);
goto exitfun;
//工單已結案
}
}
else
{
chkMOState_CloseRet = TranslateMsg("[%MONONOTEXIST%]", strLanguageMode, strResourceDir);
goto exitfun;
}
// 2016/09/08 YF, 因入庫動作並不會將生產批壓成99, 故工單永遠無法結單, 若壓成99又會有重上線問題
// 故能否結工單調整為只判斷是否還有線上的生產批
// 2018/06/07 OwenLiu, Mantis:46288, 增加數量需大於0的檢核
// 2019/12/11 Eric Mantis:65384 排除tblWIPLotBasis.LotStatus=0(未下線)的資料 (為已開立生產批的未下線資料與設定面檢核失敗而未下線成功的資料)
strSQL = " SELECT Count(A.LotNo) " + " FROM tblWIPLotState A, " + " (select C.* from tblwiplotbasis C where C.LOTSTATE<>0) B " + " WHERE A.BaseLotNo = B.BaseLotNo " + " AND B.MONo = '" + MONo + "' " + " AND A.Status In (0,1,2,3,4,5) " + " AND A.CurQty > 0 ";
// cmd.CommandText = strSQL
if (Operators.ConditionalCompareObjectGreater(ExecuteSQLQuery_Scalar(strSQL, cnnTemp), 0, false))
{
chkMOState_CloseRet = TranslateMsg("[%HavingLotinWIPInventory%],[%NOTALLOWTOCLOSEMO%]", strLanguageMode, strResourceDir);
goto exitfun;
}
// 82671: [6.0.3]在製品庫仍有數量,ERP仍可執行工單結案 Edison 2020/11/25
strSQL = " SELECT Count(A.LotNo) FROM tblINVWIPInventory_Semi A, tblWIPLotBasis B " + " WHERE A.BaseLotNo = B.BaseLotNo " + " And B.MONo = '" + MONo + "' ";
// cmd.CommandText = strSQL
if (Operators.ConditionalCompareObjectGreater(ExecuteSQLQuery_Scalar(strSQL, cnnTemp), 0, false))
{
chkMOState_CloseRet = TranslateMsg("[%HavingLotinWIPInventory%],[%NOTALLOWTOCLOSEMO%]", strLanguageMode, strResourceDir);
goto exitfun;
}
// cmmTemp.Dispose()
//0130980: [6.0.7]0129989: [萬達]工單結案條件確認
strSQL = " SELECT Count(A.BaseLotNo) FROM tblWIPLotBasis A, tblINVWIP_Scrap B WHERE A.BaseLotNo = B.LotNo AND B.SCRAPQTY > 0 AND A.MONo = '" + MONo + "' ";
if (Operators.ConditionalCompareObjectGreater(ExecuteSQLQuery_Scalar(strSQL, cnnTemp), 0, false))
{
chkMOState_CloseRet = TranslateMsg("[%HavingLotinWIPInventory%],[%NOTALLOWTOCLOSEMO%]", strLanguageMode, strResourceDir);
goto exitfun;
}
strSQL = "SELECT Count(A.BaseLotNo) FROM tblWIPLotBasis A, tblINVWIP_FailBin B WHERE A.BaseLotNo = B.LotNo AND A.MONo = '" + MONo + "' ";
if (Operators.ConditionalCompareObjectGreater(ExecuteSQLQuery_Scalar(strSQL, cnnTemp), 0, false))
{
chkMOState_CloseRet = TranslateMsg("[%HavingLotinWIPInventory%],[%NOTALLOWTOCLOSEMO%]", strLanguageMode, strResourceDir);
goto exitfun;
}
strSQL = "SELECT Count(A.BaseLotNo) FROM tblWIPLotBasis A, tblINVWIP_ComponentScrap B WHERE A.BaseLotNo = B.LotNo AND B.SCRAPQTY > 0 AND A.MONo = '" + MONo + "' ";
if (Operators.ConditionalCompareObjectGreater(ExecuteSQLQuery_Scalar(strSQL, cnnTemp), 0, false))
{
chkMOState_CloseRet = TranslateMsg("[%HavingLotinWIPInventory%],[%NOTALLOWTOCLOSEMO%]", strLanguageMode, strResourceDir);
goto exitfun;
}
strSQL = "Update tblOEMOBasis Set MOState = 99, MOCloseDate = To_Date('" + Strings.Format(DateTime.Now, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') ";
strSQL += " ,OrgMOState = " + drTemp["MOState"].ToString() + " Where MONo = '" + MONo + "'";
CollectionSQL.Add(strSQL);
CollectionRows.Add(1);
strSQL = "Insert into tblERPPendingTransLog Select TRANSACTIONID, TRANSACTIONTYPE, TICKETNO, ERPType, Creator, CreateDate ,sysdate as EventTime from tblERPPendingTrans where TRANSACTIONTYPE = 1 And TICKETNO = '" + MONo + "' ";
CollectionSQL.Add(strSQL);
CollectionRows.Add(1);
strSQL = " Delete from tblERPPendingTrans Where TRANSACTIONTYPE = 1 And TICKETNO = '" + MONo + "' ";
CollectionSQL.Add(strSQL);
CollectionRows.Add(1);
// 0151198: [6.0.7] SDD231107_01-02_ERP 工單結案接口調整, 19245, 2023/12/11
// 1.找出ERPCloseMOClearMTLQty參數值, 是否要清除工單上的還有數量的物料 0:否,不清除 ; 1:是,要清除工單上有剩餘數量的物料。
string strMOClearMTLQty = defString;
Double dblMOMTLQty_MIN = 1;
strSQL = "Select ParameterValue From tblSYSParameter Where ParameterNo = 'ERPCloseMOClearMTLQty'";
drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp);
if (drTemp.Read())
strMOClearMTLQty = drTemp["ParameterValue"].ToString();
drTemp.Close();
if (strMOClearMTLQty == "1") // 要清除
{
Decimal decNumber = 0;
// 2.找出MOMTLQty_MIN (最低工單物料數量(用於ERP工單結案清除剩餘物料))參數值
strSQL = "Select ParameterValue From tblSYSParameter Where ParameterNo = 'MOMTLQty_MIN'";
drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp);
if (drTemp.Read())
{
//判斷MOMTLQty_MIN是否為數值
if (decimal.TryParse(drTemp["ParameterValue"].ToString(), out decNumber))
dblMOMTLQty_MIN = Convert.ToDouble(drTemp["ParameterValue"]);
else
{
chkMOState_CloseRet = TranslateMsg("[%MOMTLQty_MIN%] [%IS NOT NUMERIC%]", strLanguageMode, strResourceDir);
goto exitfun;
}
}
drTemp.Close();
// 取出目前工單的物料數量
strSQL = "Select * From tblOEMOMaterialState Where MONo='" + MONo + "'";
drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp);
while (drTemp.Read())
{
// 小於最低工單物料數量時,就必須要將該物料做清除
if (Convert.ToDouble(drTemp["Qty"]) < dblMOMTLQty_MIN)
{
strSQL = "Update tblOEMOMaterialState set Qty = 0 Where MONo ='" + drTemp["MONo"].ToString() + "'" +
" And MaterialNo = '" + drTemp["MaterialNo"] + "'" +
" And MaterialLotNo = '" + drTemp["MaterialLotNo"] + "'" +
" And SubstituteMaterialNo = '" + drTemp["SubstituteMaterialNo"] + "'";
CollectionSQL.Add(strSQL);
CollectionRows.Add(1);
// 將清除前的物料紀錄回tblERPMOMTLStateClearLog
strSQL = "Insert Into tblERPMOMTLStateClearLog " +
"(MONo, MaterialNo, MaterialLotNo, UnitNo, Qty, MaterialLevel, MaterialType, InputDate, " +
"SubstituteMaterialNo, SubstituteMaterialLevel, SubstituteMaterialQty, Description, ExpireDate," +
" OpenDate, ManufactureDate, GraceDate, EventDate)";
strSQL += " (Select MONo, MaterialNo, MaterialLotNo, UnitNo, " + drTemp["Qty"] + ", MaterialLevel, MaterialType, InputDate " +
", SubstituteMaterialNo, SubstituteMaterialLevel, SubstituteMaterialQty, Description" +
", ExpireDate, OpenDate, ManufactureDate, GraceDate" +
", To_Date('" + Strings.Format(EventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')"; // 紀錄資料產生時間(EventTime)
strSQL += " From tblOEMOMaterialState";
strSQL += " Where MONo='" + drTemp["MONo"].ToString() + "'" +
" And MaterialNo = '" + drTemp["MaterialNo"] + "'" +
" And MaterialLotNo = '" + drTemp["MaterialLotNo"] + "'" +
" And SubstituteMaterialNo = '" + drTemp["SubstituteMaterialNo"] + "')";
CollectionSQL.Add(strSQL);
CollectionRows.Add(1);
}
}
drTemp.Close();
}
ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, CollectionSQL, CollectionRows);
chkMOState_CloseRet = "success";
exitfun:;
}
catch (Exception e1)
{
throw;
}
finally
{
drTemp.Close();
CloseConnection(cnnTemp);
// cmd = Nothing
}
return chkMOState_CloseRet;
}
#endregion
private string funGetRequestKey(ref object SCI_Object, string pService, string pUserNo, string pServiceName, string pCalledID = defString, string pRequestKey = defString)
{
string funGetRequestKeyRet = default(string);
DataRow[] drERPSetting;
string strFilter = "";
do
{
try
{
strFilter = "ERP_Name ='" + pService + "' ";
if ((pCalledID ?? "") != defString && string.IsNullOrEmpty(pCalledID) == false)
strFilter += " And CalledID ='" + pCalledID + "' ";
// 取得服務資訊
drERPSetting = dtERPSetting.Select(strFilter);
if (drERPSetting == null)
break;
if (drERPSetting.Length != 1)
break;
if ((pCalledID ?? "") == defString)
{
pCalledID = drERPSetting[0]["CalledID"].ToString();
}
// 2017-03-17, Joe, 加Parameter for E10
(SCI_Object as iMESCIO.SCI.ERP.ERPRequestBase).enterprise_no = drERPSetting[0]["ERP_ENTID"].ToString();
(SCI_Object as iMESCIO.SCI.ERP.ERPRequestBase).site_no = drERPSetting[0]["ERP_ORG"].ToString();
// 轉XML
string RequestHead = "";
RequestHead += "";
string RequestDataKey = "" + drERPSetting[0]["ERP_ENTID"].ToString() + "" + drERPSetting[0]["ERP_ORG"].ToString() + "";
string RequestXML_Body = Conversions.ToString((SCI_Object as iMESCIO.SCI.ERP.ERPRequestBase).ParseXml());
pRequestKey = modAutoRunLibrary.GetRequestKey(RequestHead);
funGetRequestKeyRet = pRequestKey;
}
catch (Exception ex)
{
throw;
}
}
while (false);
return funGetRequestKeyRet;
}
}
}