2025年8月18日 星期一

V20301–非TLS 品項交修件建檔- ALL_LIST- [勾選]後,再維修[件號]欄位值 - 修改存檔後,更新CHK_PK_OBJ.ALL_LIST 欄位值

 目的: V20301 – 非TLS 品項交修件建檔- [勾選]後,再維修[件號]欄位值 
             - 修改存檔後,更新CHK_PK_OBJ.ALL_LIST 欄位值

處理說明:  1>render 時,若[V] 則 CHK_PK_OBJ.ALL_LIST必需取最新欄位值 
                             1>>先去除目前PK, data
                              CHK_PK_OBJ.ALL_LIST = jQuery.grep(CHK_PK_OBJ.ALL_LIST, function (item) {
return item.FMNO != Tmp_PK;
});
                              2>>再加入  cur_data
                                     CHK_PK_OBJ.ALL_LIST.push(rec.data);
                   2>[存檔]後,會觸發 render event     




1>*.js
var J_columns = [
{ header: "", xtype: "rownumberer", width: 50, align: "center", sortable: false },
{
//2023/07/14 microed , 將 V120201 改成 雅嵐版本 - 分頁勾選
header: "勾選",
dataIndex: "CHECK", width: 40, xtype: 'checkcolumn', menuDisabled: true, sortable: false,
//rec : 目前資料欄位值
renderer: function (value, metadata, rec, rowIndex, colIndex, store) {
//var item = record.get('PROM_ID') + '&' + record.get('CR_NO') + '&' + record.get('ITEM_NO');
console.log("renderer rec:", rec);
console.log("renderer rec.data:", rec.data);
var Tmp_PK = rec.get('FMNO');
var chkd = '';
if (rec.get('CHECK') === true) {
if (CHK_PK_OBJ.PK_LIST.indexOf(Tmp_PK) == -1) {
CHK_PK_OBJ.PK_LIST.push(Tmp_PK);
console.log("checked CHK_PK_OBJ.PK_LIST:", CHK_PK_OBJ.PK_LIST);
//CHK_PK_OBJ.ALL_LIST.push(rec.data);
//console.log("checked  CHK_PK_OBJ.ALL_LIST:", CHK_PK_OBJ.ALL_LIST);
}
  //2025/08/18 microed, 有時 rec_data 已異動,但 CHK_PK_OBJ.ALL_LIST 欄位值未異動,
                          //  [確認轉發工]鈕會 Error (PN未反應最新欄位值)
  //所以 CHK_PK_OBJ.ALL_LIST , 先移除 rec_data , 再重新寫入 rec_data
CHK_PK_OBJ.ALL_LIST = jQuery.grep(CHK_PK_OBJ.ALL_LIST, function (item) {
return item.FMNO != Tmp_PK;
});
CHK_PK_OBJ.ALL_LIST.push(rec.data);

chkd = 'checked';
rec.set('CHECK', true);
}



2025年8月12日 星期二

V20305E- [請料提出(Email專案)]鈕 –多次Email & Email附檔 – Email多個人員

 目的: V20305E- [請料提出(Email專案)] 多次Email & Email附檔 – Email多個人員

處理說明: 1>MailMessage ChkMail 
                       MailMessage ChkMail = new MailMessage();
                       string mail_from = "tlsapp@ms.aidc.com.tw";
               ChkMail.From = new MailAddress(mail_from, "AMM系統", System.Text.Encoding.UTF8);          
                      ChkMail.To.Clear();
                      Tmp_EMPLYID_ = myfunc.getEmp_EMAIL("611292"); \
                      if (!myfunc.checkisnull(Tmp_EMPLYID_))
                          ChkMail.To.Add(Tmp_EMPLYID_);   /若Tmp_EMPLYID_空白,.Add(xxx)則會Error                         
                  2>Email 多個人員,且不重複
                       List<String> List_EMAIL_EMPLYID = new List<string>();
                       if (List_EMAIL_EMPLYID.IndexOf(Tmp_P_EMPLYID) == -1)
                              List_EMAIL_EMPLYID.Add(Tmp_P_EMPLYID);
                       for (int i = 0; i < List_EMAIL_EMPLYID.Count; i++)
                      {
                         Tmp_EMPLYID_ = myfunc.getEmp_EMAIL(List_EMAIL_EMPLYID[i]);
                         if (!myfunc.checkisnull(Tmp_EMPLYID_))
                            ChkMail.To.Add(Tmp_EMPLYID_);
                       }                        
                  3>Email 內容, 以 <br> 換行
                               Tmp_Subject = "領用物料有瑕疵通知";
                               Tmp_Content = "附檔為V20305_瑕疵物料申請清單.xlsx\r\n"
                                                        +"請專案承辦人協助工廠籌補物料說明\r\n"
                                                        +"瑕疵物料需求已提出,請協助籌補。 \r\n";
                                Tmp_Content = Tmp_Content.Replace("\r\n", "<br>");
                                sendMail(Tmp_Subject, Tmp_Content, ChkMail);
                4>附加檔案 - 匯出檔名不可和套表檔名相同 - 加_yyyyMMdd.xlsx
            string Tmp_FName = "V20305_上下層同時提料申請清單.xlsx";      //套表的檔案名稱 
            string documentPath = HttpContext.Current.Server.MapPath("~") + "document\\";
string pathFName = documentPath + "V20305_上下層同時提料申請清單_"+DateTime.Now.ToString("yyyyMMdd") + ".xlsx";

                     wk.SaveToStream(mstream, FileFormat.Version2007);
                     wk.SaveToFile(FileName1, FileFormat.Version2007);
                     //Email附檔                    
                     ChkMail = new MailMessage();
                     mail_from = "tlsapp@ms.aidc.com.tw";
            ChkMail.From = new MailAddress(mail_from, "AMM系統", System.Text.Encoding.UTF8);
                    ContentType ct = new ContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");            
                    Attachment attm = new Attachment(FileName1, ct);  //FileName1:檔案名稱含 path
                    ChkMail.Attachments.Add(attm);   
 



1>*.cs
                 wk.SaveToStream(mstream, FileFormat.Version2007);
                 wk.SaveToFile(FileName1, FileFormat.Version2007);
                //Email附檔                    
                ChkMail = new MailMessage();
                mail_from = "tlsapp@ms.aidc.com.tw";
              ChkMail.From = new MailAddress(mail_from, "AMM系統", System.Text.Encoding.UTF8);
              ContentType ct = new ContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");            
                    Attachment attm = new Attachment(FileName1, ct);
                    ChkMail.Attachments.Add(attm);
                    //Email 通知人員,加入 [生管人員]
                    Tmp_Sql = " SELECT SAPMAN "
                                   + "  FROM   AMM_SRO "
                                   + "  WHERE  AMMNO IN (" + Tmp_List_AMMNO_Str + ")";
                    Tmp_dt1 = myfunc.SqlOpen(Tmp_dt1, Tmp_Sql);
                    Tmp_cnt1 = Tmp_dt1.Rows.Count;
                    for (int i = 0; i < Tmp_cnt1; i++)
                    {
                        Tmp_SAPMAN = Tmp_dt1.Rows[i]["SAPMAN"].ToString();
                        if (List_EMAIL_EMPLYID.IndexOf(Tmp_SAPMAN) == -1)
                            List_EMAIL_EMPLYID.Add(Tmp_SAPMAN);
                    }
                    for (int i = 0; i < List_EMAIL_EMPLYID.Count; i++)
                    {
                        Tmp_EMPLYID_ = myfunc.getEmp_EMAIL(List_EMAIL_EMPLYID[i]);
                          if (!myfunc.checkisnull(Tmp_EMPLYID_))
                            ChkMail.To.Add(Tmp_EMPLYID_);
                    }                        
                    Tmp_Subject = "領用物料有瑕疵通知";
                    Tmp_Content = "附檔為V20305_瑕疵物料申請清單.xlsx\r\n"
                                             +"請專案承辦人協助工廠籌補物料說明\r\n"
                                             +"瑕疵物料需求已提出,請協助籌補。 \r\n";
                    Tmp_Content = Tmp_Content.Replace("\r\n", "<br>");
                    sendMail(Tmp_Subject, Tmp_Content, ChkMail);


2025年8月10日 星期日

V80203 -[匯出使用物料]鈕 -PK_LIST - myfunc.JSON2dt - 判斷欄位值為 null 時, row[prop.Name] = prop.Value?.ToObject(); --> 會Error -

目的: 將目前所勾選的資料匯出成 xls 檔案

處理說明: 1> JSON2dt
                       DataTable dt1 = myfunc.JSON2dt(Tmp_DataString1);
                   2>prop.Value.Type==JTokenType.Null
                          if (prop.Value.Type == JTokenType.Null)
                              row[prop.Name] = DBNull.Value;
                          else
                               row[prop.Name] = prop.Value?.ToObject<double>();



1>myfunc.cs
 public static DataTable JSON2dt(string par_JSONString)
        {
            // 反序列化 JSON 字符串為 JArray
            try
            {
                JArray jsonArray = JArray.Parse(par_JSONString);
                // 創建 DataTable
                DataTable Tmp_dt = new DataTable();
                // 動態添加欄位
                foreach (JObject obj in jsonArray.Children<JObject>())
                {
                    foreach (JProperty prop in obj.Properties())
                    {
                        if (!Tmp_dt.Columns.Contains(prop.Name))
                        {
                            // 根據值的類型動態設置欄位類型
                            Type columnType = typeof(string); // 默認為 string
                            if (prop.Value.Type == JTokenType.Float || prop.Value.Type == JTokenType.Integer)
                            {
                                columnType = typeof(double);
                            }
                            Tmp_dt.Columns.Add(prop.Name, columnType);
                        }
                    }
                }
                // 將 JSON 數據添加到 DataTable 中
                foreach (JObject obj in jsonArray.Children<JObject>())
                {
                    DataRow row = Tmp_dt.NewRow();
                    foreach (JProperty prop in obj.Properties())
                    {
                        if (Tmp_dt.Columns[prop.Name].DataType == typeof(double))
                        {
                            //2025/08/11 micro edit , 排除 null .ToObject<double> 
                            if (prop.Value.Type == JTokenType.Null)
                                     //if (prop.Value == nulll)
                                    //prop.Value = null;    // prop.Value.ToObject<double>(); --> error
                                    row[prop.Name] = DBNull.Value;
                            else
                                row[prop.Name] = prop.Value?.ToObject<double>();
                        }
                        else
                        {
                            row[prop.Name] = prop.Value?.ToString();
                        }
                    }
                    Tmp_dt.Rows.Add(row);
                }
                //Tmp_dt = (DataTable)JsonConvert.DeserializeObject(par_JSONString, (typeof(DataTable)));
                //// 使用 DataSet 反序列化 JSON 字串 DataSet ds = JsonConvert.DeserializeObject<DataSet>(par_JSONString);
                return Tmp_dt;
            }  // end of try{ }


2>*.js
var Tmp_DataAry = [];
    var isOk = true;
    var np = {};
    var Tmp_Str = "";
    if (CHK_PK_OBJ.PK_LIST.length == 0) {
        mywarnalert("請先選擇要匯出使用物料的AMM單號s");
        return false;
    }
    var cur_rec;
    for (let i = 0; i <= CHK_PK_OBJ.PK_LIST.length - 1; i++) {
        cur_rec = CHK_PK_OBJ.ALL_LIST[i];
        console.log("cur_rec:", cur_rec);
        console.log("CHK_PK_OBJ.ALL_LIST[i]:", CHK_PK_OBJ.ALL_LIST[i]);            
        Tmp_DataAry.push(cur_rec);
    } //  end of for (let i=0,)                
    // 將目前子畫面的資料(Table)轉成 JSON字串
    var Tmp_DataString1 = JSON.stringify(Tmp_DataAry);
    //詢問  "此筆資料來源為 AMM,請問是否將[拆檢交修單號(RPNOAF)]異動為 [AMM單號]?   
    var np = {};
    np["FName"] = "V80203_使用物料明細統計表_檔案格式.xlsx";
    np["DataString1"] = Tmp_DataString1;        
    f_downloadFile('EX_DFile', '../api/V80203AAPI/XlsOut', np, 'POST', function () {
        var r = r_cookies('EX_DFile');
        mysuccessalert(r);
    });

3>*.cs
public void XlsOut()
        {
            var c = HttpContext.Current;
            NameValueCollection nvc = c.Request.Form;
            // 1>將 SS_FILES.FBOLD 存成 Local檔案
            //取得目前子畫面的欄位值
            string Tmp_DataString1 = nvc["DataString1"];    //Tmp_DataString:  將目前子畫面的資料. JSON字串   

            //將 table 字串轉成 DataTable
            //DataTable DataTable1 = (DataTable)JsonConvert.DeserializeObject(Tmp_DataString1, (typeof(DataTable)));
            DataTable dt1 = myfunc.JSON2dt(Tmp_DataString1);
            




 

2025年8月5日 星期二

V20305D -[批次匯入] - "R1,S1".IndexOf(Tmp_PCAT)==-1 , 若 Tmp_PCAT=="R" , 則會判斷錯誤

1>*.cs
//if ((Tmp_CBIL == "2") && ("R1,S1".IndexOf(Tmp_PCAT)==-1)   
--> 會有問題  Tmp_PCAT="R" , 則 "R1,S1".IndexOf(Tmp_PCAT) 會錯誤

--> 改寫如下:
  if ( (Tmp_CBIL == "2") && (Tmp_PCAT!="R1") && (Tmp_PCAT!="S1" ) )
                        {

V20305D_批次匯入- Log_檔案-[匯出結果說明]欄位-垂直上靠, 水平左靠 - SPIRE.XLS

 目的: V20305D_批次匯入- Log_檔案-[匯出結果說明]欄位-垂直上靠, 水平左靠  - SPIRE.XLS

處理說明: 1>cell.Style.VerticalAlignment   &  cell1.Style.HorizontalAlignment
                       CellRange cell1 = ws.Columns[44];
                       cell1.Style.VerticalAlignment = VerticalAlignType.Top;
                       cell1.Style.HorizontalAlignment = HorizontalAlignType.Left;
                   2> cell.Style.WrapText  &  cell1.RowHeight 
                        cell1.Style.WrapText = true;
                        cell1.RowHeight = 50;


1>*.cs
ws.Range[myfunc.GetExcelPos(44, 1)].Value = "匯入結果說明";
ws.AutoFitRow(1);
//設定[匯出結果說明]欄.垂直上靠, 水平左靠
CellRange cell1 = ws.Columns[44];
cell1.Style.VerticalAlignment = VerticalAlignType.Top;
cell1.Style.HorizontalAlignment = HorizontalAlignType.Left;

cell1.Style.WrapText = true;
cell1.RowHeight = 50;


PS:

垂直上靠: 使用 cell.Style.VerticalAlignment = VerticalAlignType.Top;

VerticalAlignType 是一個列舉,常用的值包括 Top(上靠)、Center(置中)和 Bottom(下靠)。

水平左靠: 使用 cell.Style.HorizontalAlignment = HorizontalAlignType.Left;

HorizontalAlignType 是一個列舉,常用的值包括 Left(左靠)、Center(置中)和 Right(右靠)。

2025年8月4日 星期一

v20305D - str2int("1.00") - 會產生錯誤 - 輸入字串格式錯誤 - str2float - throw new Exception(Tmp_ErrMsg);

 目的: str2int("1.00") - 錯誤訊息

處理說明:1>錯誤訊息,"輸入字串格式不正確" , 使用者不清楚錯誤原因                  
                 2>提供更明確的錯誤訊息 "str2int('1.00') , 輸入字串格式不正確" --> str2int('1.00')錯誤
                      throw new Exception(Tmp_ErrMsg);                


1>*.cs
//Tmp_QPA="1.00", myfunc.str2int(Tmp_QPA) --> 產生錯誤訊息, "輸入字串格式不正確"  
//-->  改成 str2float
if (!((Tmp_RSTHAH == "I") || (myfunc.str2float(Tmp_QPA) == 0) || (Tmp_QPA == "AR")))\
{

2>myfunc.cs - 錯誤訊息更明確  - str2int(string par_str)
 public static int str2int(string par_str)
        {
            try
            {
                int Tmp_int = 0;
                if ((par_str == null) || (par_str.Equals("")))
                    Tmp_int = 0;
                else
                    Tmp_int = int.Parse(par_str);
                return Tmp_int;
            }
            catch (Exception e)
            {
                //Console.WriteLine(e);
                string Tmp_ErrMsg = "str2int(" + myfunc.AA(par_str) + ")<br>"
                                                   + e.Message;
                throw new Exception(Tmp_ErrMsg);                
            }
        }

V20305D – [批次匯入]- tooltip – Hint – 按鈕顯示輔助說明 - 訊息

目的: V20305D – [批次匯入]- tooltip – Hint – 顯示輔助說明

 處理說明: 1> Ext.getCmp("btn_V20305D").tooltipType = "title";
                   2> Ext.getCmp("btn_V20305D").tooltip ="資料來源(DTSOR):T,"
                                                                      + "且可提料(REQMAF)=Y,"
                                                                      +"才可執行[批次匯入]";



1>*.js
 //設定tooltips
   //Ext.QuickTips.init();
    Ext.getCmp("btn_V20305D").tooltipType = "title";
    Ext.getCmp("btn_V20305D").tooltip ="資料來源(DTSOR):T,"
                                                                      + "且可提料(REQMAF)=Y,"
                                                                      +"才可執行[批次匯入]";
-->
var Tmp_Str = "資料來源(DTSOR):T,<br>"
                     + "且可提料(REQMAF)=Y,<br>"
                     + "才可執行[批次匯入]<br>";
    Tmp_Str = Tmp_Str.replaceAll("<br>", "");
    Ext.getCmp("btn_V20305D").tooltipType = "title";
    Ext.getCmp("btn_V20305D").tooltip = Tmp_Str;