2025年10月8日 星期三

V20108E – [匯入人員清單] - SelectFile(Ok_process) ; - 挑選檔案 - XLS2XLS - 傳回匯入結果XLS,並顯示執行訊息 -New

 目的: V20108E – 工作程序資源設定 – [匯入人員清單] - SelectFile(Ok_process) ;  
           - 挑選檔案  - XLS2XLS - 傳回匯入結果XLS, 並顯示執行結果訊息
           - 傳送檔案至前端

處理說明: 1>*.js 挑選檔案子畫面 - SelectFile(Ok_process);  -Ok_process 挑選後執行func
                        1>>SelectFile [挑選檔案子畫面]確定後,會將檔案傳送至後端
                        2>>讀取檔案名稱(*.js)  
                               var Tmp_FileObj = Ext.getCmp('FName');
                               var Tmp_FName = Ext.getDom(Tmp_FileObj.inputId).value;
                 2>*.cs 檔案傳至後端  - Request.Files[0]   
                        Stream file_Strm = Request.Files[0].InputStream;
                        wk.LoadFromStream(file_Strm);
                        file_Name = Path.GetFileName(Request.Files[0].FileName);
                3>*.cs  wk 存至檔案  & Stream 
                    wk = new Workbook();
                    MemoryStream mstream = new MemoryStream();
            string documentPath = HttpContext.Current.Server.MapPath("~") + "document\\";  // 實實路徑  
                    string FileName = "V20108_匯入人員清單_匯入結果說明.xlsx";
                    string FileName1 = documentPath + FileName;
                    wk.SaveToStream(mstream, FileFormat.Version2007);
                    wk.SaveToFile(FileName1, FileFormat.Version2007);
              4>  傳送結果檔案至前端
HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=\"" + HttpUtility.UrlEncode((string)FileName, System.Text.Encoding.UTF8) + "\"");
HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.UTF8;
HttpContext.Current.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
HttpContext.Current.Response.BinaryWrite(mstream.ToArray()); 
              5> 顯示執行結果 - 透過 Cookie
                   me.up("form").submit({
                         url: Tmp_url_Str,
                        method: 'POST',
                         headers: { 'Content-type': 'multipart/form-data' },
                         params: np,        
                 });
                 //顯示結果訊息..
                var mask = new Ext.LoadMask(Ext.getBody(), {
                      msg: '處理中,請稍待...'
                 });
                 mask.show();//使用 mask 需手動呼叫show() 方法下
                //若要傳送檔案到前端, 必需用 Cookie 判斷後端是否已完成
               //每1秒檢核一次,是否已完成, 若已完成,則不再檢核
                var timer = setInterval(function () {
                var r = r_cookies('Rtn_Msg');
                 if (!checkisnull(r)) {
                     mysuccessalert(r);
                     clearInterval(timer);
                      mask.hide();
                      timer = null;
                     //將子畫面關閉- SelectFile
                     Ext.getCmp("SelectForm_cancelbtn").fireHandler();          
        }
    }, 1000);  //1000ms = 1sec  

        //*.cs - 加入 Cookie 訊息
            Tmp_RtnMsg = "人員清單匯入成功!!";                        
            MyCookie = new HttpCookie("Rtn_Msg", HttpUtility.UrlEncode(Tmp_RtnMsg));
            HttpContext.Current.Response.Cookies.Add(MyCookie);            
            HttpContext.Current.Response.End();






1>*.js
var pub_MAIN_SUB1_Str = "";
function CALL_V20108E_OK() {
        var Tmp_MAIN_SUB1;
        Tmp_MAIN_SUB1 = Ext.getCmp('sub_MAIN_SUB1').getValue();
        pub_MAIN_SUB1_Str = Tmp_MAIN_SUB1["sub_MAIN_SUB1"];  //EMP/DEV
        console.log("pub_MAIN_SUB1_Str:", pub_MAIN_SUB1_Str);
        var Tmp_FName = "";
        SelectFile(Ok_process);
        console.log("Tmp_FName:", Tmp_FName);        
};

//[選擇檔案]子畫面. [確認匯入]鈕 , 處理
function Ok_process(me, e, eOpts) {
    //取得 [檔案上傳].檔名
    var Tmp_FileObj = Ext.getCmp('FName');
    var Tmp_FName = Ext.getDom(Tmp_FileObj.inputId).value;
    console.log("FName Obj:", Tmp_FileObj);
    var Tmp_Str = "";
    var Tmp_cur_recs = Ext.getCmp("grid_M").getSelectionModel().getSelection();
    var Tmp_cur_rec = Tmp_cur_recs[0];
    var Tmp_cur_MITM = Tmp_cur_rec.data["MITM"];
    var Tmp_cur_WITM = Tmp_cur_rec.data["WITM"];    
    console.log("Tmp_cur_MITM:", Tmp_cur_MITM);

    var np = {};
    np["MAIN_SUB"] = pub_MAIN_SUB1_Str;
    np["cur_MITM"] = Tmp_cur_MITM;
    np["cur_WITM"] = Tmp_cur_WITM;
    np["FName"] = Tmp_FName;
    
    console.log("np.FName: ", np.FName);
    console.log("np.MAIN_SUB: ", np.MAIN_SUB);
    if (pub_MAIN_SUB1_Str="EMP")
        Tmp_url_Str = '../api/V20108EAPI/uploadFileToDB_EMP';
    else
        Tmp_url_Str = '../api/V20108EAPI/uploadFileToDB_DEV';
    me.up("form").submit({
        //standardSubmit: false,    //default:false
        url: Tmp_url_Str,
        method: 'POST',
        headers: { 'Content-type': 'multipart/form-data' },
        params: np,        
    });

    //顯示結果訊息..
    var mask = new Ext.LoadMask(Ext.getBody(), {
        msg: '處理中,請稍待...'
    });

    mask.show();//使用 mask 需手動呼叫show() 方法下
    //若要傳送檔案到前端, 必需用 Cookie 判斷後端是否已完成
    //每1秒檢核一次,是否已完成, 若已完成,則不再檢核
    var timer = setInterval(function () {

        var r = r_cookies('Rtn_Msg');
        //console.log("r_cookies=", r);
        if (!checkisnull(r)) {
            mysuccessalert(r);
            clearInterval(timer);
            mask.hide();
            timer = null;
            //將視窗關閉
            Ext.getCmp("SelectForm_cancelbtn").fireHandler();
            //this.up("window").close();
            //this.up("window").destroy();
        }
    }, 1000);  //1000ms = 1sec
};  // end of Ok_process() {  //批次新增


2>*.cs
 public void uploadFileToDB_EMP()
        {

            HttpContext c = HttpContext.Current;
            NameValueCollection nvc = c.Request.Form;
            string Tmp_MAIN_SUB = nvc["MAIN_SUB"];
            string Tmp_MITM = nvc["cur_MITM"];
            string Tmp_WITM = nvc["cur_WITM"];            
            string FName = nvc["FName"];
            Workbook wk = null;
            MemoryStream mstream = new MemoryStream();

            HttpRequest Request = HttpContext.Current.Request;
            var response = this.Request.CreateResponse();
            string file_Name = FName;
            string FILEDT = DateTime.Now.ToString("yyyy/MM/dd");
            string Tmp_RtnMsg = "";
            string Tmp_RtnMsg1 = "";
            string Tmp_Sql = "", Tmp_Str = "";
            bool Tmp_isOk;
            int Tmp_cnt = 0;

          string documentPath = HttpContext.Current.Server.MapPath("~") + "document\\";  // 實實路徑    
            string FileName = "V20108_匯入人員清單_匯入結果說明.xlsx";
            string FileName1 = documentPath + FileName;

            List<string> SQLStringList_A = new List<string>();
            HttpCookie MyCookie;  //將訊息傳至前端

            string fileType = Request.Files[0].ContentType;
            Stream file_Strm = Request.Files[0].InputStream;
            file_Name = Path.GetFileName(Request.Files[0].FileName);
            int fileSize = Request.Files[0].ContentLength;
                byte[] fileRcrd = new byte[fileSize];
                //更新資料庫欄位值                
                int Tmp_curpos = 0;
                try
                {

                    wk = new Workbook();
                    wk.LoadFromStream(file_Strm);
                    Worksheet sheet1 = wk.Worksheets[0];//獲取第一個工作表
                    //新增[匯入結果說明]欄位 - 於最後一欄位
                    sheet1.Range[myfunc.GetExcelPos(5, 0)].Value = "匯入結果說明";
                    Tmp_WC = sheet1.Range[myfunc.GetExcelPos(0, 0)].Value;
                     //若[欄位標題 ]有錯誤時,傳回錯誤訊息
                     MyCookie = new HttpCookie("Rtn_Msg", HttpUtility.UrlEncode(Tmp_RtnMsg));
                     HttpContext.Current.Response.Cookies.Add(MyCookie);                    
                     HttpContext.Current.ApplicationInstance.CompleteRequest();
                         :
              }
                    wk.SaveToStream(mstream, FileFormat.Version2007);
                    wk.SaveToFile(FileName1, FileFormat.Version2007);
 HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=\"" + HttpUtility.UrlEncode((string)FileName, System.Text.Encoding.UTF8) + "\"");
                    HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.UTF8;
                    HttpContext.Current.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
                    HttpContext.Current.Response.BinaryWrite(mstream.ToArray());
                    if (Tmp_isOk == false)
                    {
                        //匯入檔案失敗
                        Tmp_Str = "人員清單匯入失敗<br>"
                                        + "(" + FName + ")<br>";
                        MyCookie = new HttpCookie("Rtn_Msg", HttpUtility.UrlEncode(Tmp_Str));
                        HttpContext.Current.Response.Cookies.Add(MyCookie);
                        HttpContext.Current.Response.End();
                        return;
                    }
                   

2025年10月2日 星期四

V20108 – 工作程序資源設定 – Grid 上下移 - 上/下移

 目的: V20108 – 工作程序資源設定 – Grid 上下移

處理說明: 1>par_dest_grid.store.add(Tmp_Add_rec); par_source_grid.store.remove(cur_rec);   
                        var cur_recs = par_source_grid.getSelectionModel().getSelection();
                        var cur_rec=cur_recs[0];
                        var Tmp_EMPID = nulltoStr(cur_rec.data['EMPID']).toString();
                        var Tmp_EMPNM = nulltoStr(cur_rec.data['EMPNM']).toString();
                        var Tmp_Add_rec = {
                              EMPID: Tmp_EMPID,
                              EMPNM: Tmp_EMPNM,
                        }
                         par_dest_grid.store.add(Tmp_Add_rec);
                         par_source_grid.store.remove(cur_rec);




1>*.js

//移動員工
    function MoveEMP(par_source_grid, par_dest_grid) {
        var cur_recs = par_source_grid.getSelectionModel().getSelection();
        if (cur_recs.length == 0) {
            myalert("請先選擇要移動的資料!!");
            return;
        }
            
        var cur_rec = cur_recs[0];
        var Tmp_EMPID = nulltoStr(cur_rec.data['EMPID']).toString();
        var Tmp_EMPNM = nulltoStr(cur_rec.data['EMPNM']).toString();
        var Tmp_Add_rec = {
            EMPID: Tmp_EMPID,
            EMPNM: Tmp_EMPNM,
        }
        //console.log("Ext.getCmp(grid_D11):", Ext.getCmp("grid_D11"));
        //若目前資料不存在,則加入 grid_D11
        if (par_dest_grid.store.find("EMPID", Tmp_EMPID) == -1) {
            par_dest_grid.store.add(Tmp_Add_rec);
            par_source_grid.store.remove(cur_rec);
        }
    }


V20108 – 人員挑選 – 按鈕水平置中(pack=’center’)

 目的: V20108 – 人員挑選 按鈕水平置中(pack=’center’)

處理說明:  1>按鈕於 Panel 的水平置中, pack='center'
                        cmp_Panel_D121.layout = { type: 'hbox', align: 'stretch', pack: 'center' };  // 水平置中
                        var cmp_btn_D1211 = get_cmp_btn1("      ", "btn_D1211", 10, "icon-up");
                        var cmp_btn_D1212 = get_cmp_btn1("      ", "btn_D1212", 10, "icon-down");
                        cmp_Panel_D121.items.push(cmp_btn_D1211, cmp_btn_D1212);  //熟手.上/下移按鈕


1>*.js
  //2025/09/24 隱藏原本 Detail  & 加入 [人員Panel) *3    
    var cmp_Panel_D = get_cmp_panel1(300, 100, "Panel_D");
    cmp_Panel_D.title = "Panel_D";
    var cmp_tabPanel_D1 = get_cmp_tabpanel1("人員挑選");    
    var cmp_tabPanel_D2 = get_cmp_tabpanel1("裝備挑選");    
    cmp_Panel_D.layout = { type: 'hbox', align: 'stretch' };
    cmp_Panel_D.items.push(cmp_tabPanel_D1, cmp_tabPanel_D2);
    cmp_tabPanel_D1.id = "tabPanel_D1";
    cmp_tabPanel_D2.id = "tabPanel_D2";

    //畫面版面 - 人員挑選
    var cmp_Panel_D1 = get_cmp_panel1(300, 100, "Panel_D1"); //人員挑選
    cmp_Panel_D1.layout = { type: 'vbox', align: 'stretch' };
    var cmp_Panel_D11 = get_cmp_panel1(300, 100, "Panel_D11");  //人員基本檔(AMM_EMP)    
    var cmp_Panel_D12 = get_cmp_panel1(300, 30, "Panel_D12");    //[往上],[往下]按鈕
    var cmp_Panel_D13 = get_cmp_panel1(300, 100, "Panel_D13");  //已挑選人員[熟手], [生手]人員
    cmp_Panel_D11.id = 'Panel_D11';
    cmp_Panel_D11.layout = 'fit';
    cmp_Panel_D121 = get_cmp_panel1(300, 30, "Panel_D121");
    cmp_Panel_D122 = get_cmp_panel1(300, 30, "Panel_D122");
    cmp_tabPanel_D1.items.push(cmp_Panel_D1);
    cmp_Panel_D1.items.push(cmp_Panel_D11, cmp_Panel_D12, cmp_Panel_D13);  
    cmp_Panel_D12.items.push(cmp_Panel_D121, cmp_Panel_D122);  //[熟手]人員.上/下移, [生手]人員.上/下移

    //往上往下按鈕
    //var cmp_btn_move_left=get_cmp_btn1("往右","btn_move1","","'icon-right'")
    cmp_Panel_D121.layout = { type: 'hbox', align: 'stretch', pack: 'center' };  // 水平置中
    var cmp_btn_D1211 = get_cmp_btn1("      ", "btn_D1211", 10, "icon-up");
    var cmp_btn_D1212 = get_cmp_btn1("      ", "btn_D1212", 10, "icon-down");
    cmp_Panel_D121.items.push(cmp_btn_D1211, cmp_btn_D1212);  //熟手.上/下移按鈕
    cmp_Panel_D122.layout = { type: 'hbox', align: 'stretch', pack: 'center' };  // 水平置中
    var cmp_btn_D1221 = get_cmp_btn1("      ", "btn_D1221", 10, "icon-up");
    var cmp_btn_D1222 = get_cmp_btn1("      ", "btn_D1222", 10, "icon-down");
    cmp_Panel_D122.items.push(cmp_btn_D1221, cmp_btn_D1222); //生手.上/下移按鈕


    //cmp_tabPanel_D1.items[0].items.push(cmp_Panel_D11, cmp_Panel_D12, cmp_Panel_D13);
    console.log("cmp_tabPanel_D1:", cmp_tabPanel_D1);
    console.log("cmp_tabPanel_D1.items[0]:", cmp_tabPanel_D1.items[0]);
    //cmp_tabPanel_D1.items[0].tabBar.height = 0;
    //cmp_tabPanel_D1.items[0].tabBar.hidden = true;
    console.log("Ext.getCmp(tab_D):", Ext.getCmp("tab_D"));
    console.log("Ext.getCmp(tabPanel_D1)_0:", Ext.getCmp("tabPanel_D1"));
    //Ext.getCmp("tabPanel_D1").setTabVisible(0, false);
    //Ext.getCmp("tabPanel_D2").setTabVisible(1, false);

    
    cmp_Panel_D.border = 1;
    cmp_Panel_D11.border = 1;
    cmp_Panel_D12.border = 1;
    cmp_Panel_D13.border = 1;
    //Ext.getCmp("tab_D").tabBar = { height: 0, hidden: true }; // 可選,直接隱藏 tabBar    
    Ext.getCmp("tab_D").tabBar.height = 0;
    Ext.getCmp("tab_D").tabBar.hidden = true;
    Ext.getCmp("tab_D").add(cmp_Panel_D);
    
    //Ext.getCmp("tab_D").hide();
    //2025/09/25 原本Detail 的Tab 設為隱藏
    Ext.getCmp("tab_D").setTabVisible(0, false);
    Ext.getCmp("tab_D").setTabVisible(1, false);
    Ext.getCmp("tab_D").setActiveTab(2);

2025年10月1日 星期三

V20108 – 工作程序資源設定 – 隱藏 tabBar

 目的: V20108 – 工作程序資源設定 隱藏 tabBar

處理說明: 1>Template tab_D 才有 setTabVisible 函式, 一般 tabTable 無 setTabVisible 函式
                       Ext.getCmp("tab_D").setTabVisible(0, false);
                       Ext.getCmp("tab_D").setTabVisible(1, false);
                       Ext.getCmp("tab_D").setActiveTab(1);
                  2>一般 tabPanel ,必需用.getTabBar().getComponent(0).hide();
                       Ext.getCmp("tabPanel_D1").getTabBar().getComponent(0).hide(); // tabbar 不顯示
                       Ext.getCmp("tabPanel_D2").getTabBar().getComponent(0).hide();


1>*.js
//Template tab_D 才有 setTabVisible 函式, 一般 tabTable setTabVisible 函式
          Ext.getCmp("tab_D").setTabVisible(0, false);       
          Ext.getCmp("tab_D").setTabVisible(1, false);
          Ext.getCmp("tab_D").setActiveTab(1);
       //一般 tabPanel ,必需用.getTabBar().getComponent(0).hide();
         Ext.getCmp("tabPanel_D1").getTabBar().getComponent(0).hide();  // tabbar 不顯示
         Ext.getCmp("tabPanel_D2").getTabBar().getComponent(0).hide();

2025年9月26日 星期五

V20108 – 工作程序資源設定 – 人員 & 裝備 – Panel加入自訂 Grid - tabBar 隱藏/顯示

 目的: V20108 – 工作程序資源設定 人員 & 裝備 – Panel加入自訂 Grid

處理說明:1>產生 TMGrid
var grid_D11 = Ext.create('TMGrid', {
        grid_id: 'grid_D11',
        columns: J_columns_D11,
        autoScroll: true,
        flex: 1,
        store: Ext.create('gridstore', { model: J_gridmodel_D11 }),
    });
                 2>Panel 加入 自訂Grid
                     Ext.getCmp("Panel_D11").add(grid_D11);
                3>Grid .分頁bar 隱藏
                      Ext.getCmp('grid_D11_ptb').hide();
                4>tabBar 全部隱藏
                     Ext.getCmp("tab_D").tabBar.height = 0;
                     Ext.getCmp("tab_D").tabBar.hidden = true; 
                5>tabBar 部份不顯示 - Template tab_D 才有setTabVisible 函式, 一般tabPanel無該函式
                    Ext.getCmp("tab_D").setTabVisible(0, false);
                    Ext.getCmp("tab_D").setTabVisible(1, false);
                    Ext.getCmp("tab_D").setActiveTab(2);      
               6>一般 tabPanel 隱藏 tabBar
                  Ext.getCmp("tabPanel_D1").getTabBar().getComponent(0).hide();  // tabbar 不顯示
                  Ext.getCmp("tabPanel_D2").getTabBar().getComponent(0).hide();






1>*.js
  //2025/09/24 隱藏原本 Detail  & 加入 [人員Panel) *3    
    cmp_Panel_D = get_cmp_panel1(300, 100, "Panel_D");
    cmp_Panel_D.title = "Panel_D";
    cmp_tabPanel_D1 = get_cmp_tabpanel1("人員挑選");    
    cmp_tabPanel_D2 = get_cmp_tabpanel1("裝備挑選");    
    cmp_Panel_D.layout = { type: 'hbox', align: 'stretch' };
    cmp_Panel_D.items.push(cmp_tabPanel_D1, cmp_tabPanel_D2);
    cmp_tabPanel_D1.id = "tabPanel_D1";
    cmp_tabPanel_D2.id = "tabPanel_D2";

    //人員挑選
    cmp_Panel_D1 = get_cmp_panel1(300, 100, "Panel_D1"); //人員挑選
    cmp_Panel_D1.layout = { type: 'vbox', align: 'stretch' };
    cmp_Panel_D11 = get_cmp_panel1(300, 100, "Panel_D11");
    cmp_Panel_D11.id = 'Panel_D11';
    cmp_Panel_D11.layout = 'fit';
    cmp_Panel_D12 = get_cmp_panel1(300, 30, "Panel_D12");
    cmp_Panel_D13 = get_cmp_panel1(300, 100, "Panel_D13");
    cmp_tabPanel_D1.items.push(cmp_Panel_D1);
    cmp_Panel_D1.items.push(cmp_Panel_D11, cmp_Panel_D12, cmp_Panel_D13);
    //cmp_tabPanel_D1.items[0].items.push(cmp_Panel_D11, cmp_Panel_D12, cmp_Panel_D13);
    console.log("cmp_tabPanel_D1:", cmp_tabPanel_D1);
    console.log("cmp_tabPanel_D1.items[0]:", cmp_tabPanel_D1.items[0]);
    //cmp_tabPanel_D1.items[0].tabBar.height = 0;
    //cmp_tabPanel_D1.items[0].tabBar.hidden = true;
    console.log("Ext.getCmp(tab_D):", Ext.getCmp("tab_D"));
    console.log("Ext.getCmp(tabPanel_D1)_0:", Ext.getCmp("tabPanel_D1"));
    //Ext.getCmp("tabPanel_D1").setTabVisible(0, false);
    //Ext.getCmp("tabPanel_D2").setTabVisible(1, false);

    
    cmp_Panel_D.border = 1;
    cmp_Panel_D11.border = 1;
    cmp_Panel_D12.border = 1;
    cmp_Panel_D13.border = 1;
    //Ext.getCmp("tab_D").tabBar = { height: 0, hidden: true }; // 可選,直接隱藏 tabBar    
    Ext.getCmp("tab_D").tabBar.height = 0;
    Ext.getCmp("tab_D").tabBar.hidden = true;
    Ext.getCmp("tab_D").add(cmp_Panel_D);
    
    //Ext.getCmp("tab_D").hide();
    //2025/09/25 原本Detail 的Tab 設為隱藏
    //Template tab_D 才有 setTabVisible 函式,一般tabPanel無該函式
    Ext.getCmp("tab_D").setTabVisible(0, false);  
    Ext.getCmp("tab_D").setTabVisible(1, false);
    Ext.getCmp("tab_D").setActiveTab(2);

    console.log("grid_D11  - STEP0");
    //加入 grid_Dxx
    //var grid_D11 = Ext.create('grid_D', {
    //    grid_id: 'grid_D11',        
    //    columns: J_columns_D11,
    //    //title: '子步序說明',
    //    store: Ext.create('gridstore_D', { model: J_gridmodel_D11 }),
    //    //form_items: J_formFields_D1,
    //    form_id: 'myform_D11'
    //});

    var grid_D11 = Ext.create('TMGrid', {
        grid_id: 'grid_D11',
        columns: J_columns_D11,
        autoScroll: true,
        flex: 1,
        store: Ext.create('gridstore', { model: J_gridmodel_D11 }),
    });

    console.log("0 Ext.getCmp(Panel_D11):", Ext.getCmp("Panel_D11"));
    //cmp_Panel_D11.add(grid_D11);
    Ext.getCmp("Panel_D11").add(grid_D11);
    Ext.getCmp('grid_D11_ptb').hide();
    
//一般 tabPanel 隱藏 tabBar
Ext.getCmp("tabPanel_D1").getTabBar().getComponent(0).hide();  // tabbar 不顯示
Ext.getCmp("tabPanel_D2").getTabBar().getComponent(0).hide();


2025年9月24日 星期三

V20108 – 工作程序資源設定 – 客製化MD畫面- 樣板.Detail Grid畫面 - 隱藏不用,換成客製化Detail畫面

 目的: V20108 – 工作程序資源設定 客製化MD畫面- Detail非標準的MD畫面

處理說明: 1>原本的樣板.Detail畫面.隱藏不用
                      Ext.getCmp("tab_D").setTabVisible(0, false);
                      Ext.getCmp("tab_D").setTabVisible(1, false);
                      Ext.getCmp("tab_D").setActiveTab(2);
                   2>加入客製化 Detail畫面 - 
                        cmp_Panel_D = get_cmp_panel1(300, 100, "Panel_D");
                        cmp_tabPanel_D1 = get_cmp_tabpanel1("人員挑選");    
                        cmp_tabPanel_D2 = get_cmp_tabpanel1("裝備挑選");    
                        cmp_Panel_D.layout = { type: 'hbox', align: 'stretch' };
                        cmp_Panel_D.items.push(cmp_tabPanel_D1, cmp_tabPanel_D2);
                        Ext.getCmp("tab_D").add(cmp_Panel_D);
                        cmp_tabPanel_D1.id = "tabPanel_D1";
                        cmp_tabPanel_D2.id = "tabPanel_D2";
                    3>設定TabBar.隱藏
                         Ext.getCmp("tab_D").tabBar.height = 0;
                         Ext.getCmp("tab_D").tabBar.hidden = true;
                   4>畫面顯示後, Tab不顯示
                       Ext.getCmp("tabPanel_D1").getTabBar().getComponent(0).hide();
                   5>畫面顯示後,Tab隱藏
                       listeners: {
                            afterrender:    function () {
                                    Ext.getCmp("tabPanel_D1").getTabBar().getComponent(0).hide();
                         }};


1>*.js
    cmp_Panel_D = get_cmp_panel1(300, 100, "Panel_D");
    cmp_tabPanel_D1 = get_cmp_tabpanel1("人員挑選");    
    cmp_tabPanel_D2 = get_cmp_tabpanel1("裝備挑選");    
    cmp_Panel_D.layout = { type: 'hbox', align: 'stretch' };
    cmp_Panel_D.items.push(cmp_tabPanel_D1, cmp_tabPanel_D2);
    cmp_tabPanel_D1.id = "tabPanel_D1";
    cmp_tabPanel_D2.id = "tabPanel_D2";

    //人員挑選
    cmp_Panel_D1 = get_cmp_panel1(300, 100, "Panel_D1"); //人員挑選
    cmp_Panel_D1.layout = { type: 'vbox', align: 'stretch' };
    cmp_Panel_D11 = get_cmp_panel1(300, 100, "Panel_D11");
    cmp_Panel_D12 = get_cmp_panel1(300, 30, "Panel_D12");
    cmp_Panel_D13 = get_cmp_panel1(300, 100, "Panel_D13");
    cmp_tabPanel_D1.items.push(cmp_Panel_D1);
    cmp_tabPanel_D1.items[0].items.push(cmp_Panel_D11, cmp_Panel_D12, cmp_Panel_D13);
    
    cmp_Panel_D.border = 1;
    cmp_Panel_D11.border = 1;
    cmp_Panel_D12.border = 1;
    cmp_Panel_D13.border = 1;
    Ext.getCmp("tab_D").tabBar.height = 0;
    Ext.getCmp("tab_D").tabBar.hidden = true;
    Ext.getCmp("tab_D").add(cmp_Panel_D);
    
    Ext.getCmp("tab_D").setTabVisible(0, false);
    Ext.getCmp("tab_D").setTabVisible(1, false);
    Ext.getCmp("tab_D").setActiveTab(2);

2>*.js
  var viewport = Ext.create('Ext.container.Viewport', {
        layout: 'border',
        items: [{
            region: 'center',
            layout: 'fit',
            autoScroll: true,
            flex: 2,
            border: false,
            items: [TMMDViewEdit]
        }],
        listeners: {
            afterrender:    function () {
                Ext.getCmp("tabPanel_D1").getTabBar().getComponent(0).hide();
                console.log("Ext.getCmp(tabPanel_D1)_2:", Ext.getCmp("tabPanel_D1"));
            }
        }
    });

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
}