2025年9月3日 星期三

V20305L-[上下層同時提料需求申請]鈕- PK_LIST –勾選資料傳至後端 - 全部匯出 - Email附檔 -New

 目的: V20305L-[上下層同時提料需求申請]

            - PK_LIST –勾選資料傳至後端-全部匯出- Email附檔

處理說明:

              1>勾選資料傳至後端
          for (var i = 0; i < CHK_PK_OBJ.PK_LIST.length; i++) {
                cur_rec = CHK_PK_OBJ.ALL_LIST[i];
                 Tmp_DataAry1.push(cur_rec);
           }

          let Tmp_DataString1 = JSON.stringify(Tmp_DataAry1);
          var np= {};
          np["DataString1"] = Tmp_DataString1;
           Tmp_url = '../../api/V20305LAPI/CHECK_EXIST_UPDOWN_LCN';
           Tmp_RtnStr = getUrlStr(Tmp_url, np, "檢核 [交修單號] 是否存存上下層提料件號");

              2>全部資料傳至後端
           for (var i = 0; i < Tmp_Grid.store.getCount(); i++) {
                 cur_rec = Tmp_Grid.store.getAt(i);
                 console.log("cur_rec :", cur_rec);
                 console.log("cur_rec.data :", cur_rec.data);
                 if (!(JSON.stringify(cur_rec.data) === '{}')) {
                        Tmp_DataAry2.push(cur_rec.data);
            }
           let Tmp_DataString2 = JSON.stringify(Tmp_DataAry2);  //子畫面所有資料

              3>Email 附檔 - 套表
                      套表檔案名稱(*.xlsx)和匯出檔案名稱(*_yyyyMMdd.xlsx)不可相同,
                       否則會Error      



1>*.js
1>>勾選資料傳至後端
var cur_rec;
let Tmp_DataAry1 = [];
var Tmp_DTSOR,Tmp_AMMNO;
var Tmp_Str;
for (var i = 0; i < CHK_PK_OBJ.PK_LIST.length; i++) {
     cur_rec = CHK_PK_OBJ.ALL_LIST[i];
     Tmp_AMMNO = cur_rec.AMMNO.toString();
     Tmp_DTSOR = cur_rec.DTSOR.toString();
     if (!(JSON.stringify(cur_rec) === '{}')) {
             Tmp_DataAry1.push(cur_rec);
}
}
//主畫面勾選資料
let Tmp_DataString1 = JSON.stringify(Tmp_DataAry1);
var np= {};
np["DataString1"] = Tmp_DataString1;

//新增 AMM_TLSAR & AMM_AR
//STEP2: 若 AMM_TLSAR & AMM_AR of FMNO 不存在, 則新增該檔案資料(AMM_TLSAR, AMM_AR)
Tmp_url = '../../api/V20305LAPI/CHECK_EXIST_UPDOWN_LCN';
Tmp_RtnStr = getUrlStr(Tmp_url, np, "檢核 [交修單號] 是否存存上下層提料件號");
if (!checkRtnOK(Tmp_RtnStr)) {
mywarnalert(Tmp_RtnStr);
return;
}


2>>全部資料傳至後端
function V20305L_OK() {
//STEP1 : 更新[上下層需求說明(AMM_UOCD.UDRQSN)]
var Tmp_Grid = Ext.getCmp('sub_Grid');
var cur_rec;
let Tmp_DataAry2 = []; //目前子畫面的資料,傳至後端
var Tmp_Str = "";
var Tmp_RtnMsg = "";
if (Tmp_Grid.store.length == 0) {
mywarnalert("目前無[上下層同時提料]資料,無法確認送出");
return;
}
//取得目前子畫面所有資料
for (var i = 0; i < Tmp_Grid.store.getCount(); i++) {
cur_rec = Tmp_Grid.store.getAt(i);
console.log("cur_rec :", cur_rec);
console.log("cur_rec.data :", cur_rec.data);
if (!(JSON.stringify(cur_rec.data) === '{}')) {
Tmp_DataAry2.push(cur_rec.data);
}
}
let Tmp_DataString2 = JSON.stringify(Tmp_DataAry2); //子畫面所有資料


var np = {};
np["DataString1"] = Tmp_DataString1; //主畫面勾選皫資料
np["UDRQSN"] = Ext.getCmp("sub_UPDOWN_DESCP").getValue();
np["STAUOCD"] = Ext.getCmp("s_STAUOCD").getValue(); //主畫面的[是否提料] - 過濾修件
//np["DataString1"] = Tmp_DataString1;
var Tmp_url = "../../api/V20305LAPI/UPDATE_UDRQSN";
Tmp_RtnMsg = getUrlStr(Tmp_url, np, "更新[上下層需求說明(AMM_UOCD.UDRQSN)]欄位值");
if (!checkRtnOK(Tmp_RtnMsg)) {
myalert(Tmp_RtnMsg);
return;
} // end of SelAllBtn_click


3>>Email - 套表
           string Tmp_FName = "V20305_上下層同時提料申請清單.xlsx";      //套表的檔案名稱 : 
            string documentPath = HttpContext.Current.Server.MapPath("~") + "document\\";
            string pathFName = documentPath + "V20305_上下層同時提料申請清單_" +DateTime.Now.ToString("yyyyMMdd") + ".xlsx";
            FileStream fs = null;
            Workbook wk = null;
            fs = myfunc.get_SS_FILES(Tmp_FName);
            wk = new Workbook();
            wk.LoadFromStream(fs);
            Worksheet ws1 = wk.Worksheets[0];//獲取第一個工作表            
            try
           {
                
                ws1.AllocatedRange.AutoFitColumns();
                wk.SaveToStream(stream, FileFormat.Version2007); 
                 wk.SaveToFile(pathFName, FileFormat.Version2007);

2025年9月1日 星期一

V20305M – [匯入PDM BOM檔]鈕 - Panel隱藏

 目的: V20305M – [匯入PDM BOM] - Panel隱藏

處理說明: 1>var cmp_sub_panel1 = get_cmp_panel1(200);
                                             cmp_sub_panel1.id = "sub_panel1";
                            2>Panel隱藏
                                    Ext.getCmp("sub_panel1").hide();


1>*.js
 var cmp_sub_panel1 = get_cmp_panel1(200);
    cmp_sub_panel1.id = "sub_panel1";
    var cmp_sub_PN = get_cmp_txt1('件號', 'sub_PN', 110, 120);
    var cmp_sub_EONO = get_cmp_txt1('ECNO', 'sub_EONO', 110, 100);
    var cmp_sub_CDCODE = get_cmp_txt1('情況碼', 'sub_CDCODE', 110, 100);
    cmp_sub_panel1.items.push(cmp_sub_PN, cmp_sub_EONO, cmp_sub_CDCODE);

win.show();
Ext.getCmp("sub_panel1").hide();

2025年8月28日 星期四

V20305J- [非TLS品項批次提料]鈕 – [選擇檔案] - 過濾檔案名稱 *.xlsx

 目的: V20305J- [非TLS品項批次提料]鈕 – [選擇檔案] - 過濾檔案名稱 *.xlsx

處理說明: 1>選擇檔案: 限制 *. xlsx 的附屬檔名
                  2>Web程式 SPIRE.XLS 處理 Excel檔案名稱均需為 *.xlsx
                      否則產生的檔案(*.xls) 常常無法開啟

                 3> { xtype: 'filefield', accept:’.xlsx’, }
                       var cmp_SelFile = get_cmp_file1("sub_File");
                       Ext.getCmp("sub_File").fileInputEl.set({ accept: '.xlsx' });






2025年8月26日 星期二

V20305F –SQL : AND rownum=1

 目的: V20305F –SQL : AND  rownum=1  

處理說明:  1>Rownum ORDER BY 前的順序
                   2>若Rownum 要依 ORDER BY 的順序
                       必需先 SELECT rownum,xx
                                    FROM     (SELECT * FROM xx ORDER BY xx)







2025年8月25日 星期一

V20305E1 – [請料提出(EMAIL專案)]-來源: AMM – Email附檔 - 套表檔名 & 匯出檔名需不同檔案

 目的:V20305E1–[請料提出(EMAIL專案)]- Email附檔-套表檔名&匯出檔名不可相同

處理說明: 1> 套表檔名: "V20305_物料清單_請料提出_A.xlsx";
                        匯出檔案名稱:  "V20305_物料清單_請料提出_A_"+yyyymmdd+".xlsx";                                              string Tmp_FName = "V20305_物料清單_請料提出_A.xlsx";   //套表檔名
                        string Tmp_FName1 = ExportFile2(Tmp_FName, Tmp_AMMNOs);  //匯出檔案+日期
                ContentType ct1 = new ContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
                Attachment attm1 = new Attachment(Tmp_FName1, ct1);
                ChkMail.Attachments.Add(attm1);  
          
              2>匯出檔案名稱+yyyymmdd.xls
                    string Tmp_oFName = "V20305_物料清單_請料提出_A_" 
                                                  + DateTime.Now.ToString("yyyyMMdd") + ".xlsx";
                     string FileName1 = documentPath + Tmp_oFName;                
                     wk.SaveToFile(FileName1, FileFormat.Version2007);  //匯出報表檔案名稱




1>*.js
var Tmp_subject = "AMM V20305  交修件提料完成通知 ";
                var Tmp_content = " 拆檢提領編號(" + Tmp_OGONOAFs + ")<br>"
                    + " 件號(" + Tmp_PNs + ")<br>"
                    + "工廠已完成零件需求登錄<br><br>"
            + "附檔為 [V20305_物料清單_請料提出_A_" + DatetoStr(cnow(), "Ymd") +".xlsx]<br>"
                    + "已EMAIL通知[專案人員]&[發工人員]&[提料申請人員]<br>"
                    + "執行後續作業<br>";
                Tmp_content = Tmp_content.replace(/<br>/g, "\r\n");                
                //DTSOR='A' 的 EMAIL
                await Call_V20305E1(Tmp_subject, Tmp_content, Tmp_EMPLYIDs, Tmp_AMMNOs);

2>*.cs

public string ExportFile2(string par_FName,string par_AMMNOs)
        {
            string Tmp_FName = par_FName;      //套表的檔案名稱 , 
            //string documentPath = HttpContext.Current.Server.MapPath("~") + "document\\";
            //string pathFName = documentPath + Tmp_FName;
            FileStream fs = null;
            Workbook wk = null;
            fs = myfunc.get_SS_FILES(Tmp_FName);
            wk = new Workbook();
            wk.LoadFromStream(fs);
                :
 string documentPath = HttpContext.Current.Server.MapPath("~") + "document\\";  // 取得實實的路徑                  //匯出報表檔案名稱 : Tmp_oFName  不可和套表名稱一樣
               string Tmp_oFName = "V20305_物料清單_請料提出_A_" 
                                                  + DateTime.Now.ToString("yyyyMMdd") + ".xlsx";
                string FileName1 = documentPath + Tmp_oFName;                
                wk.SaveToFile(FileName1, FileFormat.Version2007);  //匯出報表檔案名稱
                return FileName1;


2025年8月20日 星期三

V20305E: 程序1-->程序2-->程序3 - -JavaScript 的用法 async & await – 並包成 try {..} catch{..} 顯示錯誤訊息

 目的: V20305E: 程序1-->程序2-->程序3   
          -JavaScript 的用法 async & await – 並包成 try {..} catch{..} 顯示錯誤訊息

處理說明:  1> 程序1-->程序2-->程序3   - 每一程序執行OK,才執行下一程序
                        將function 包成 async 及 await  - 並利用 try{..} catch {..} - 顯示錯誤訊息

async function CALL_V20305_ALL() {
    try {
        await CALL_STEP1();
        await CALL_STEP2();
        await CALL_STEP3();
        mywarnalert("成功_finally:CALL_V20305_ALL -完成");
} //end of try
catch (err) {
        mywarnalert(err);
    }
}   // end of  async CALL_V20305_ALL
 
                   2>程序1 :
async function CALL_STEP1() {
try {
Ext.util.Cookies.set("Rtn_Msg", "");
await CHECK_V20305_TEST1(true);
Ext.util.Cookies.set("Rtn_Msg", "");
await CHECK_V20305_TEST2(true);
Ext.util.Cookies.set("Rtn_Msg", "");
await CHECK_V20305_TEST3(true);
} //end of try
catch (err) {
  throw new Error(err); //若有 throw Error ,則不會再往下執行 --> 會自動加 Error:
}
                      } // end of CALL_STEP1

             3> await 函式 : 必需包成 Promise
function CHECK_V20305_TEST1(success) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            if (success) {
                resolve({ data: '這是伺服器回傳的資料 1' });  //成功傳回資料
            } else {
                reject('資料載入失敗_reject 1');   //會自動發出 throw exception      
            }
        }, 1000); 
})
}



1>*.js
async function CALL_V20305_ALL() {
    try {
        Ext.util.Cookies.set("Rtn_Msg", "");
        await CALL_V20305_TEST();
        console.log("CHECK_V20305_TEST() 完成!!: ");
        await CALL_V20305_UPDATE();
        console.log("CHECK_V20305_UPDATE 完成!!: ");        
        console.log("成功_finally:CALL_V20305_ALL -完成");
        mywarnalert("成功_finally:CALL_V20305_ALL -完成");
    }  //end of try
    catch (err) {
        console.log("錯誤_CALL_V20305_ALL:" + err);
        mywarnalert(err);
    }

async  function CALL_V20305_TEST() {    
    try {
        Ext.util.Cookies.set("Rtn_Msg", "");
        await CHECK_V20305_TEST1(true);   //檢核資枓, 若沒問題 ,才執行 TEST2 
        console.log("CHECK_V20305_TEST1 completed: ");
        Ext.util.Cookies.set("Rtn_Msg", "");
        await CHECK_V20305_TEST2(true);   //檢核資枓, 若沒問題 ,才執行 TEST3
        console.log("CHECK_V20305_TEST2 completed: ");
        Ext.util.Cookies.set("Rtn_Msg", "");
        await CHECK_V20305_TEST3(true);   
        console.log("CHECK_V20305_TEST3 completed: ");
        console.log("成功_finally:CALL_V20305_TEST -完成");
        //mywarnalert("成功_finally:CALL_V20305_TEST -完成");
    }  //end of try
    catch (err) {
        throw new Error(err);  //若有 throw Error ,則不再往下執行 - throw new Error(..)會自動加 Error:
    }    
}   // end of CALL_V20305_TEST

function CHECK_V20305_TEST1(success) {
    return new Promise((resolve, reject) => {
        //setTimeout(() => {
        //    if (success) {
        //        resolve({ data: '這是伺服器回傳的資料 1' });
        //        console.log("CHECK_V20305_TEST1 - resolve");              
        //    } else {
        //        reject('資料載入失敗_reject 1');
        //        console.log("CHECK_V20305_TEST1 - reject");
        //        //throw new Error('資料載入失敗_throw');
        //    }
        //}, 1000);
        var Tmp_isok = true;
        var Tmp_DataAry = [];
        for (let i = 0; i <= CHK_PK_OBJ.PK_LIST.length - 1; i++) {
            cur_rec = CHK_PK_OBJ.ALL_LIST[i];
            Tmp_DataAry.push(cur_rec);
        }  //end of for (let i = 0; i <= CHK_PK_OBJ.PK_LIST.length - 1; i++) {
        var Tmp_DataAryStr = JSON.stringify(Tmp_DataAry);
        var np = {};
        np["DataArySTr"] = Tmp_DataAryStr;
        //CHECK_V20305E_1  -  檢核交修單號已有工時/開放提料/TLS已有請料未提出記錄( CSM_AR,CSM_AF,CSM_UOCD)
        Tmp_url = '../../api/V20305EAPI/CHECK_V20305E_1';
        Ext.getCmp('s_form').submit({
            method: "POST",
            url: Tmp_url,  //更新資料庫單況            
            standardSubmit: true,
            params: np,
            async: false,
        });  //end of Ext.Ajax.Request               

        var mask = new Ext.LoadMask(Ext.getBody(), {
            msg: '[請料提出]鈕,資料檢核中_1, 請稍待...'
        });
        mask.show();//使用 mask 需手動呼叫show() 方法下            
        var timer = setInterval(function () {
            var r = r_cookies('Rtn_Msg');
            console.log("cookies Rtn_Msg =", r);
            //若有傳回值,則執行下一步驟
            if (!checkisnull(r)) {
                mask.hide();
                clearInterval(timer);
                if (r.indexOf("錯誤") > -1) {
                    r = r.replace(/\r\n/g, "<br>"); //置換所有  /r/n  --> <br>
                    console.log("CHECK_V20305E_1  failure !! ")
                    reject(r);   //產生錯誤訊息
                    Tmp_isok = false;
                    //return r;  //若有錯誤,則顯示錯誤訊息, 不再執行下一步騳
                }
                if (r.indexOf("成功") > -1) {
                    console.log("CHECK_V20305E_1  ok !! ")
                    resolve(r); // TEST OK
                }
            }  //end of   if (!checkisnull(r)) {
        }, 1000)  // end of timer
    });  // end of new Promise
}

V20305 - async 及 await 的實際用法_2 , 主程序1 --> 主程序2 , 若主程序1沒問題 , 才執行下一主程序2

 目的: V20305 - async 及 await 的實際用法_2, - 兩個主程序 , 主程序沒問題
            執行主程序1 --> 執行主程序2  , 若主程序1沒問題才執行下一主程序2

處理說明: 1>async function CALL_V20305_ALL() {
                       try {        
                                await CALL_V20305_TEST();
                                await CALL_V20305_UPDATE();
                                mywarnalert("成功_finally:CALL_V20305_ALL -完成");
                              }  //end of try
                       catch (err) {
                                            mywarnalert("錯誤_try_catch_ALL:" + err);
                       }
                       }   // end of CALL_V20305_ALL
              
                2>async  function CALL_V20305_TEST() {    
                      try {
                               await CHECK_V20305_TEST1(true);   //true/false : 成功/失敗
                               await CHECK_V20305_TEST2(true);   
                               await CHECK_V20305_TEST3(true);   
                             }  //end of try
                   catch (err) {
                             //若有 throw Error ,則不會再往下執行 , 不則會視為沒錯誤
                             throw new Error("錯誤_try_catch_TEST: " + err);  
                           }    
                    }   // end of CALL_V20305_TEST

               3>async function CALL_V20305_UPDATE() {
                   try {
                          await CHECK_V20305_UPDATE1(true);   //檢核資枓, 若沒問題 ,才執行 TEST2
                          await CHECK_V20305_UPDATE2(true);   //檢核資枓, 若沒問題 ,才執行 UPDATE3
                          await CHECK_V20305_UPDATE3(true);
                          }  //end of try
                catch (err) {
                     //若有 throw Error ,則不會再往下執行, 否則視為沒問題, 仍會往下執行
                      throw new Error("錯誤_try_catch_UPDATE: " + err);  
                   }
                  }   // end of CALL_V20305_UPDATE
              
              4>function CHECK_V20305_TEST1(success) {
                   return new Promise((resolve, reject) => {
                       setTimeout(() => {
                       if (success) {
                           resolve({ data: '這是伺服器回傳的資料 1' });  //-->會傳回資料                     
                       } else {
                       reject('資料載入失敗_reject 1');  //--> 會產生 throw Exception
                        console.log("CHECK_V20305_TEST1 - reject");
                       //throw new Error('資料載入失敗_throw');
                       }
                     }, 1000);
                      });
                  }

               5>function CHECK_V20305_TEST2(success) {
                      return new Promise((resolve, reject) => {
                      setTimeout(() => {
                      if (success) {
                           resolve({ data: '這是伺服器回傳的資料_2' });
                           console.log("CHECK_V20305_TEST2 - resolve");
                      } else {
                          reject('資料載入失敗_reject_2');
                          console.log("CHECK_V20305_TEST2 - reject");
                          //throw new Error('資料載入失敗_throw');
                      }
                  }, 1000);
                  });
               }




1>V20305_TEST.js
async function CALL_V20305_ALL() {
    try {        
        await CALL_V20305_TEST();
        console.log("CHECK_V20305_TEST() 完成!!: ");
        await CALL_V20305_UPDATE();
        console.log("CHECK_V20305_UPDATE 完成!!: ");        
        console.log("成功_finally:CALL_V20305_ALL -完成");
        mywarnalert("成功_finally:CALL_V20305_ALL -完成");
    }  //end of try
    catch (err) {
        console.log("錯誤_try_catch_ALL: " + err);
        mywarnalert("錯誤_try_catch_ALL:" + err);
    }
}   // end of CALL_V20305_ALL


async function CALL_V20305_UPDATE() {
    try {
        await CHECK_V20305_UPDATE1(true);   //檢核資枓, 若沒問題 ,才執行 TEST2
        console.log("CHECK_V20305_UPDATE1 completed: ");
        await CHECK_V20305_UPDATE2(true);   //檢核資枓, 若沒問題 ,才執行 UPDATE3
        console.log("CHECK_V20305_UPDATE2 completed: ");
        await CHECK_V20305_UPDATE3(true);
        console.log("CHECK_V20305_UPDATE3 completed: ");
        console.log("成功_finally:CALL_V20305_UPDATE -完成");
        //mywarnalert("成功_finally:CALL_V20305_UPDATE -完成");
    //end of try
    catch (err) {
        //console.log("錯誤_try_catch_UPDATE: " + err);
        //mywarnalert("錯誤_try_catch_UPDATE:" + err);
        throw new Error("錯誤_try_catch_UPDATE: " + err);  //若有 throw Error ,則不會再往下執行
    }
}   // end of CALL_V20305_UPDATE

function CHECK_V20305_UPDATE1(success, param2) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            if (success) {
                resolve({ data: '這是伺服器回傳的資料 1' });
                console.log("CHECK_V20305_UPDATE1 - resolve");
            } else {
                reject('資料載入失敗_reject 1');  //reject 會自動發出 throw
                console.log("CHECK_V20305_UPDATE1 - reject");
            }
        }, 1000);
    });
}

function CHECK_V20305_UPDATE2(success) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            if (success) {
                resolve({ data: '這是伺服器回傳的資料_2' });
                console.log("CHECK_V20305_UPDATE2 - resolve");
            } else {
                reject('資料載入失敗_reject_2');
                console.log("CHECK_V20305_UPDATE2 - reject");
            }
        }, 1000);
    });
}

function CHECK_V20305_UPDATE3(success) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            if (success) {
                resolve({ data: '這是伺服器回傳的資料_3' });
                console.log("CHECK_V20305_UPDATE3 - resolve");
            } else {
                reject('資料載入失敗_reject_3');
                console.log("CHECK_V20305_UPDATE3 - reject");
            }
        }, 1000);
    });
}





async  function CALL_V20305_TEST() {    
    try {
        await CHECK_V20305_TEST1(true);   //若沒問題 ,才執行 TEST2 - true/false : 成功/失敗
        await CHECK_V20305_TEST2(true);   //檢核資枓, 若沒問題 ,才執行 TEST3
        await CHECK_V20305_TEST3(true);   
        console.log("CHECK_V20305_TEST3 completed: ");
        console.log("成功_finally:CALL_V20305_TEST -完成");
        //mywarnalert("成功_finally:CALL_V20305_TEST -完成");
    }  //end of try
    catch (err) {
        throw new Error("錯誤_try_catch_TEST: " + err);  //若有 throw Error ,則不會再往下執行
    }    
}   // end of CALL_V20305_TEST

function CHECK_V20305_TEST1(success) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            if (success) {
                resolve({ data: '這是伺服器回傳的資料 1' });
                console.log("CHECK_V20305_TEST1 - resolve");              
            } else {
                reject('資料載入失敗_reject 1');
                console.log("CHECK_V20305_TEST1 - reject");
            }
        }, 1000);
    });
}

function CHECK_V20305_TEST2(success) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            if (success) {
                resolve({ data: '這是伺服器回傳的資料_2' });
                console.log("CHECK_V20305_TEST2 - resolve");
            } else {
                reject('資料載入失敗_reject_2');
                console.log("CHECK_V20305_TEST2 - reject");
                //throw new Error('資料載入失敗_throw');
            }
        }, 1000);
    });
}

function CHECK_V20305_TEST3(success) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            if (success) {
                resolve({ data: '這是伺服器回傳的資料_3' });
                console.log("CHECK_V20305_TEST3 - resolve");
            } else {
                reject('資料載入失敗_reject_3');
                console.log("CHECK_V20305_TEST3 - reject");
                //throw new Error('資料載入失敗_throw');
            }
        }, 1000);
    });
}


2025年8月19日 星期二

V20305 - async 及 await 的實際用法_1 , 執行程序1 --> 執行程序2 --> 執行程序3 , 若執行程序沒問題才執行下一步驟

 目的: V20305 - async 及 await 的實際用法 , 執行程序1 --> 執行程序2 --> 執行程序3  , 
           若執行程序沒問題才執行下一步驟

處理說明:  1> async 及 await 函式  - try{.. }  catch
                         async  function CALL_V20305_TEST() {    
                             try {
                               await CHECK_V20305_TEST1(true);  //檢核資枓, 若沒問題 ,才執行 TEST2
                               await CHECK_V20305_TEST2(true);      
                                     :
                            }  //end of try
                            catch (err) {
                                //若有 throw Error ,則不會再往下執行
                                 throw new Error("錯誤_try_catch_TEST: " + err); 
                            }   
                    2>function () { return new Promise(resolve,reject =>{..})   }
                        function CHECK_V20305_TEST1(success) {
                            return new Promise((resolve, reject) => {
                                setTimeout(() => {
                                if (success) {
                                resolve({ data: '這是伺服器回傳的資料 1' });  //成功,傳回成功訊息/資料
                                      console.log("CHECK_V20305_TEST1 - resolve");              
                                } else {
                               reject('資料載入失敗_reject 1');                        //失敗,傳回失敗訊息/資料
                               console.log("CHECK_V20305_TEST1 - reject");                
                              }
                              }, 1000);
                       });
                     }    





1>*.js
async  function CALL_V20305_TEST() {    
    try {
        await CHECK_V20305_TEST1(true);  //檢核資枓, 若沒問題 ,才執行 TEST2
        console.log("CHECK_V20305_TEST1 completed: ");    
        await CHECK_V20305_TEST2(true);  //檢核資枓, 若沒問題 ,才執行 TEST3
        console.log("CHECK_V20305_TEST2 completed: ");
        await CHECK_V20305_TEST3(true);  
        console.log("CHECK_V20305_TEST3 completed: ");
        console.log("成功_finally:CALL_V20305_TEST -完成");
        mywarnalert("成功_finally:CALL_V20305_TEST -完成");
    }  //end of try
    catch (err) {
        console.log("錯誤_try_catch: "+err);
        mywarnalert("錯誤_try_catch:" + err);
    }
}   // end of CHECK_V20305E

function CHECK_V20305_TEST1(success,param2) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            if (success) {
                resolve({ data: '這是伺服器回傳的資料 1' });  //成功,傳回成功訊息/資料
                console.log("CHECK_V20305_TEST1 - resolve");              
            } else {
                reject('資料載入失敗_reject 1');   //失敗,傳回失敗訊息/資料
                console.log("CHECK_V20305_TEST1 - reject");
                //throw new Error('資料載入失敗_throw');
            }
        }, 1000);
    });
}

function CHECK_V20305_TEST2(success) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            if (success) {
                resolve({ data: '這是伺服器回傳的資料_2' });
                console.log("CHECK_V20305_TEST2 - resolve");
            } else {
                reject('資料載入失敗_reject_2');
                console.log("CHECK_V20305_TEST2 - reject");
                //throw new Error('資料載入失敗_throw');
            }
        }, 1000);
    });
}


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);