2022年10月25日 星期二

V20107 - Template存檔後,額外處理資料

 目的: V20107  - Template.存檔後,額外處理資料

處理說明: 1>Template.存檔後,額外處理資料 , 寫在V20107.btn_save.click ()

                      --> 即 Template 執行完存檔後,再執行 V20107.存檔  


1>*.js
//按[存檔], 若
Ext.getCmp('btn_save').on('click', function () {
        //若 checkFormValue 有問題,則 is_Keepgoing=false , 不往下執行
        if (is_keepgoing==false)
             return ;
         if (!check_AMM_WKSTPD_isnull()) {
               console.log("if !check_AMM_WKSTPD_isnull() , return ");
               return ; // AMM_WKSTPD 已有資料,不新增 4筆資料
           }
//若 AMM_WKSTPD 為空值,則詢問是否為系統件維修,

        //若是,則  INSERT_AMM_WKSTPD4  ,寫入 4筆資料
        console.log("3 詢問是否為系統件維修嗎?");
        var Tmp_Msg = "本交修件是否為系統件維修嗎 ?";
        Ext.Msg.confirm('確認', Tmp_Msg, callBackFunc);
        function callBackFunc(id) {
            console.log("1 callBackFunc : 本交修件是否為系統件維修嗎 ?");
            if (id == 'no')
                return;
            //insert 四筆資料   AMM_WKSTPD
            var np = {};
            np["MITM"] = Ext.getCmp("MITM").getValue();
            np["PN"] = Ext.getCmp("PN").getValue();
            np["DEPID"] = Ext.getCmp("DEPID").getValue();
            np["WC"] = Ext.getCmp("WC").getValue();
            var isOk = true;
            Ext.Ajax.request({
                method: "POST",
                url: '../../api/V20107API/DO_Ins_AMM_WKSTPD4',
                params: np,
                async: false,
                success: function (response, opts) {
                    console.log("0 response.responseText=", response.responseText);
                    var Tmp_Obj = Ext.decode(response.responseText);
                    console.log("1  Tmp_Obj=", Tmp_Obj);
                    if (Tmp_Obj["success"] == true) {
                        var Tmp_Rtn_Msg = "自動新增4筆工作步序說明資料(AMM_WKSTPD)<br>"
                            + "- 進廠檢測,拆檢,組裝,完工測試<br>";
                        + Tmp_Obj["Rtn_Msg"];
                        mysuccessalert(Tmp_Rtn_Msg);
                        is_Ok=true;
                    }
                    else {
                        var Tmp_Rtn_Msg = "自動新增4筆工作步序說明資料(AMM_WKSTPD)失敗<br>"
                            + "- 進廠檢測,拆檢,組裝,完工測試<br>"
                            + "請檢核!! <br>"
                            + Tmp_Obj["Rtn_Msg"];
                        mywarnalert(Tmp_Rtn_Msg);
                        is_Ok=false;
                    }
                },  //end of success                
                failure: function (response, opts) {
                    var Tmp_Obj = Ext.decode(response.responseText);
                    var Tmp_Rtn_Msg = "新增4筆工作步序說明資料(AMM_WKSTPD)失敗<br>"
                        + "請檢核<br>"
                        + Tmp_Obj["Rtn_Msg"];
                    mywarnalert(Tmp_Rtn_Msg);
                    is_Ok=false;
                }
            })  //end of Ext.Ajax.Request        
           return is_OK;
        };  // end of callBackFunc(id)
    })  //Ext.getCmp('btn_save').on('click', function () {
    //檢核 AMM_WKSTPD 是否為空值, 若是,則傳回 true, 否則傳回 false
    function check_AMM_WKSTPD_isnull() {
        var np = {};
        var Tmp_MITM = Ext.getCmp("MITM").getValue();        
        np["MITM"] = Tmp_MITM;        
        var is_Ok = true;
        Ext.Ajax.request({
            url: '../../api/V20107API/check_AMM_WKSTPD_isnull',
            method: 'POST',
            async: false,
            params: np,
            success: function (response, opts) {
                console.log('0 check_AMM_WKSTPD_isnull sucess!!');
                //console.log('0 opts:', opts);
                //console.log('0 response:', response);
                console.log("success response.responseText:", response.responseText);
                var obj = Ext.decode(response.responseText);
                //console.log("obj:", obj);
                if (obj["success"]) {
                    console.log(' 1 check_AMM_WKSTPD_isnull  true !!');
                    is_Ok = true;
                }
                else {
                    console.log(' 2 check_AMM_WKSTPD_isnull obj[sucess]  false !!');                    
                    is_Ok = false;
                }
            },
            failure: function (response, opts) {
                console.log(' 3 check_isnotDull failure !!');
                var obj = Ext.decode(response.responseText);
                console.log("obj:", obj);
                Tmp_Str = "檢核[工作步序說明(check_AMM_WKSTPD_isnull)]失敗!! <br>"
                    + obj["Rtn_Msg"];
                mywarnalert(Tmp_Str);
                is_Ok = false;
            } // end of failure 
        });  // end of Ext.Ajax
        return is_Ok;
    }

//btn_save.beforeInsert --> 實際寫入資料庫的處理
Ext.getCmp('btn_save').beforeInsert = function () {
        console.log(" 5 beforeInsert Ext.getCmp(btn_save).beforeInsert - MD_DB.doSave(Insert )");
        var isCheck = MD_DB.doSave('Insert');
        return isCheck;
    };



2>*.cs
//檢核 [AMM_WKSTPD] 是否為有資料,若無資料,則傳回 true, 否則傳回 false
        [HttpPost]
        public HttpResponseMessage check_AMM_WKSTPD_isnull()
        {
            HttpContext c = HttpContext.Current;
            NameValueCollection nvc = c.Request.Form;
            string Tmp_MITM = nvc["MITM"];           

            var response = this.Request.CreateResponse();
            string Tmp_Sql, Tmp_Str;
            int Tmp_cnt;
            Tmp_Sql = "  SELECT   count(*)  "
                            + "  FROM     AMM_WKSTPD "
                            + "  WHERE   MITM=" + myfunc.AA(Tmp_MITM);                            
            Tmp_Str = myfunc.SqlValue(Tmp_Sql);
            if (!myfunc.checkisnull(Tmp_Str))
            {
                Tmp_cnt = int.Parse(Tmp_Str);
                if (Tmp_cnt == 0)  //AMM_WKSTPD 無資料  of  MITM
                    Tmp_Str = "{success: true }";
                else
                    Tmp_Str = "{success: false }";
            }
            response.Content = new StringContent(Tmp_Str);    // 回應內容
            return response;  //若[WC+PN]不重覆 , 傳回 true, 否則傳回 false
        }

[HttpPost]
        public void Insert()
        {
            var c = System.Web.HttpContext.Current;
            NameValueCollection nvc = c.Request.Form;
            //excuteInsert(nvc, DBTable);
            NameValueCollection nvc1 = new NameValueCollection();
            foreach (string k in nvc.Keys)
            {
                nvc1[k] = nvc[k];
            }
            // ITM=MAX_ITM 改在前端 setFormValue, 設定, 不在後端設定, 因為  store 不 reload();
            //int Tmp_MAXITM = GET_MAX_ITM();
            //nvc1["MITM"] = 
            nvc1["ENER"] = LoginUserModel.LoginUserId;
            nvc1["ENDT"] = DateTime.Now.ToString("yyyy/MM/dd"); ;
            excuteInsert(nvc1, DBTable);
        }

 [HttpPost]
        public void Update()
        {
            var c = System.Web.HttpContext.Current;
            NameValueCollection nvc = c.Request.Form;
            string[] arrCondition = getPK();
            excuteUpdate(nvc, DBTable, arrCondition);
        }

V20107 – 檢核編輯欄位值是否正確 - checkFormValue()

 目的: V20107 – 檢核編輯欄位值是否正確  - checkFormValue()

處理說明: 1>宣告 var  is_Ok ; 若 checkFormValue()  正確,則傳回 true, 否則傳回 false
                       不是由 success: function(response,opts) 傳回值
                        var is_OK=true;
                        Ext.getCmp('btn_save').checkFormValue = function () {
                        var buttonModel = Ext.create('G_buttonModel'); 
                        var modelType = buttonModel.getModelType();
                        is_Ok = true;
                       //若[新增]模式,則檢核 [工作中心]+[件號] 不可重複,
                       if (modelType == 1) { 
                            Ext.Ajax.request({
                                     url: '../../api/V20107API/check_isnotDual',
                                     method: 'POST',
                                     async: false,
                                     params: np,
                                     success: function (response, opts) {
                                         is_Ok=true;
                                     failure: function(response, opts) {
                                         is_Ok=false;
                                  })
                         return is_Ok;  

                       });


1>*.js

//[新增]時,檢核 [工作中心]+[件號] 不可重複,
    //若重複, 則顯示訊息資料重複,請重新輸入
    var is_keepgoing = true;
    
    Ext.getCmp('btn_save').checkFormValue = function () {
        console.log("checkFormValue of V20107 ");
        var buttonModel = Ext.create('G_buttonModel'); 
        var modelType = buttonModel.getModelType();
        console.log("checkFormValue modelType=", modelType);
        is_Ok = true;
        //若[新增]模式,則檢核 [工作中心]+[件號] 不可重複,
        if (modelType == 1) {
            var np = {};
            var Tmp_WC = Ext.getCmp("WC").getValue();
            var Tmp_PN = Ext.getCmp("PN").getValue();
            np["WC"] = Tmp_WC;
            np["PN"] = Tmp_PN;
            Ext.Ajax.request({
                url: '../../api/V20107API/check_isnotDual',
                method: 'POST',
                async: false,
                params: np,
                success: function (response, opts) {
                    console.log('0 check_isnotDual sucess!!');
                    //console.log('0 opts:', opts);
                    //console.log('0 response:', response);
                    console.log("success response.responseText:", response.responseText);
                    var obj = Ext.decode(response.responseText);
                    //console.log("obj:", obj);
                    if (obj["success"]) {
                        console.log(' 1 check_isnotDual  true !!');
                        is_Ok = true;
                        return true;
                    }
                    else {
                        console.log(' 2 check_isnotDull obj[sucess]  false !!');
                        Tmp_Str = "工作中心(" + Tmp_WC + ")件號(" + Tmp_PN + ") 不可重覆<br>"
                            + " 請檢核 !!<br>"
                        mywarnalert(Tmp_Str);
                        is_Ok = false;
                        return false;
                    }
                },
                failure: function (response, opts) {
                    console.log(' 3 check_isnotDull failure !!');
                    var obj = Ext.decode(response.responseText);
                    console.log("obj:", obj);
                    Tmp_Str = "檢核[工作中心]+[件號]是否重覆失敗!! <br>"
                        + obj["Rtn_Msg"];
                    mywarnalert(Tmp_Str);
                    is_Ok = false;
                    return false;
                } // end of failure 
            });  // end of Ext.Ajax
        }// if modeltype==1        
        is_keepgoing = is_Ok;
        return is_Ok;
    };  // end of  Ext.getCmp('btn_save').checkFormValue = function () 


//按[存檔], 額外自行處理的部份,若  checkFormValue()=false (is_keepgoing=false), 則不往下執行
    Ext.getCmp('btn_save').on('click', function () {
        //若 checkFormValue 有問題,則 is_Keepgoing=false , 不往下執行
        if (is_keepgoing==false)
            return ;
        console.log('step 1 click_btn_save of V20107');
        if (!check_AMM_WKSTPD_isnull()) {
            console.log("if !check_AMM_WKSTPD_isnull() , return ");
            return ;   // AMM_WKSTPD 已有資料,不新增 4筆資料
        }
        //若 AMM_WKSTPD 為空值,則詢問是否為系統件維修,
        //若是,則  INSERT_AMM_WKSTPD4  ,寫入 4筆資料
        console.log("3 詢問是否為系統件維修嗎?");
        var Tmp_Msg = "本交修件是否為系統件維修嗎 ?";
        Ext.Msg.confirm('確認', Tmp_Msg, callBackFunc);
        function callBackFunc(id) {
            console.log("1 callBackFunc : 本交修件是否為系統件維修嗎 ?");
            if (id == 'no')
                return;
            //insert 四筆資料   AMM_WKSTPD
            var np = {};
            np["MITM"] = Ext.getCmp("MITM").getValue();
            np["PN"] = Ext.getCmp("PN").getValue();
            np["DEPID"] = Ext.getCmp("DEPID").getValue();
            np["WC"] = Ext.getCmp("WC").getValue();
            var isOk = true;
            Ext.Ajax.request({
                method: "POST",
                url: '../../api/V20107API/DO_Ins_AMM_WKSTPD4',
                params: np,
                async: false,
                success: function (response, opts) {
                    console.log("0 response.responseText=", response.responseText);
                    var Tmp_Obj = Ext.decode(response.responseText);
                    console.log("1  Tmp_Obj=", Tmp_Obj);
                    if (Tmp_Obj["success"] == true) {
                        var Tmp_Rtn_Msg = "自動新增4筆工作步序說明資料(AMM_WKSTPD)<br>"
                            + "- 進廠檢測,拆檢,組裝,完工測試<br>";
                        + Tmp_Obj["Rtn_Msg"];
                        mysuccessalert(Tmp_Rtn_Msg);
                        return true;
                    }
                    else {
                        var Tmp_Rtn_Msg = "自動新增4筆工作步序說明資料(AMM_WKSTPD)失敗<br>"
                            + "- 進廠檢測,拆檢,組裝,完工測試<br>"
                            + "請檢核!! <br>"
                            + Tmp_Obj["Rtn_Msg"];
                        mywarnalert(Tmp_Rtn_Msg);
                        return false;
                    }
                },  //end of success                
                failure: function (response, opts) {
                    var Tmp_Obj = Ext.decode(response.responseText);
                    var Tmp_Rtn_Msg = "新增4筆工作步序說明資料(AMM_WKSTPD)失敗<br>"
                        + "請檢核<br>"
                        + Tmp_Obj["Rtn_Msg"];
                    mywarnalert(Tmp_Rtn_Msg);
                    return false;
                }
            })  //end of Ext.Ajax.Request        
        };  // end of callBackFunc(id)
    })  //Ext.getCmp('btn_save').on('click', function () {


2>*.cs

//檢核 [工作中心]+[件號] 是否重覆, 若不重覆,則 success=true, 若重覆, 則 success=false

[HttpPost]
public HttpResponseMessage check_isnotDual()
{
            HttpContext c = HttpContext.Current;
            NameValueCollection nvc = c.Request.Form;
            string Tmp_WC = nvc["WC"];   
            string Tmp_PN = nvc["PN"];
            var response = this.Request.CreateResponse();
            string Tmp_Sql, Tmp_Str;
            int Tmp_cnt;
            Tmp_Sql = "  SELECT   count(*)  "
                            + "  FROM     AMM_WKSTP "
                            + "  WHERE   WC=" + myfunc.AA(Tmp_WC)
                            +"   AND         PN=" + myfunc.AA(Tmp_PN);
            Tmp_Str= myfunc.SqlValue(Tmp_Sql);
            if (!myfunc.checkisnull(Tmp_Str))
            {
                Tmp_cnt = int.Parse(Tmp_Str);
                if (Tmp_cnt == 0)  //不重覆                
                    Tmp_Str = "{success: true }";
                else
                    Tmp_Str = "{success: false }";
            }
                response.Content = new StringContent(Tmp_Str);    // 回應內容
                return response;  //若[WC+PN]不重覆 , 傳回 true, 否則傳回 false
        }


V20107 呼叫共用函式 get_STDHR(par_PN,par_WITM,par_DEP12) of V20107B *.cs

目的:    V20107.cs  呼叫共用函式 get_STDHR(par_PN,par_WITM,par_DEP12)  of  V20107B *.cs  

             即 V20107 & V20107B 共用同一函式(*.cs   get_STDHR)

處理說明:   將 get_STDHR 宣告為 static 函式, 以便直接呼叫該函式

1>V20107B.cs

namespace TLSWEB_AMM.Controllers
{ //更新工時 - HRUpd
public class V20107BAPIController : BaseAPIController
{
public static float get_STDHR(string par_PN,string par_WITM,string par_DEP12){

}


2>V20107.cs

public void Ins_AMM_WKSTPD4(string par_NEXT_MITM,string par_PN, List<string> par_SQLStringList, string par_DEP12)
{
string Tmp_MITM, Tmp_WITM, Tmp_STP, Tmp_AQTY, Tmp_PQTY;
float Tmp_WHR;
string Tmp_WHR_Str;
string Tmp_ENER, Tmp_ENDT;
string Tmp_Sql;
Tmp_MITM = par_NEXT_MITM;
Tmp_AQTY = "1";
Tmp_PQTY = "1";
Tmp_ENER = LoginUserModel.LoginUserId;
Tmp_ENDT= DateTime.Now.ToString("yyyy/MM/dd");

//新增 WITM='1'
Tmp_WITM = "1";
Tmp_STP = "進廠檢測";
Tmp_WHR = V20107BAPIController.get_STDHR(par_PN, Tmp_WITM, par_DEP12);
Tmp_WHR_Str = Tmp_WHR.ToString();
Tmp_Sql = " INSERT INTO AMM_WKSTPD "
+ " ( MITM,WITM,STP,"
+ " AQTY,PQTY,WHR,ENER,ENDT) "
+ " VALUES "
+ " (" + myfunc.AA(Tmp_MITM) + "," + myfunc.AA(Tmp_WITM) + "," + myfunc.AA(Tmp_STP) + ","
+ myfunc.AA(Tmp_AQTY) + "," + myfunc.AA(Tmp_PQTY) + "," + myfunc.AA(Tmp_WHR_Str) +","
+ myfunc.AA(Tmp_ENER) +","+ myfunc.AA(Tmp_ENDT)+ ") ";
par_SQLStringList.Add(Tmp_Sql);

//新增 WITM='2'
Tmp_WITM = "2";
Tmp_STP = "拆檢";
Tmp_WHR = V20107BAPIController.get_STDHR(par_PN, Tmp_WITM, par_DEP12);
Tmp_WHR_Str = Tmp_WHR.ToString();
Tmp_Sql = " INSERT INTO AMM_WKSTPD "
+ " ( MITM,WITM,STP,"
+ " AQTY,PQTY,WHR,ENER,ENDT) "
+ " VALUES "
+ " (" + myfunc.AA(Tmp_MITM) + "," + myfunc.AA(Tmp_WITM) + "," + myfunc.AA(Tmp_STP) + ","
+ myfunc.AA(Tmp_AQTY) + "," + myfunc.AA(Tmp_PQTY) + "," + myfunc.AA(Tmp_WHR_Str) + ","
+ myfunc.AA(Tmp_ENER) + "," + myfunc.AA(Tmp_ENDT) + ") ";
par_SQLStringList.Add(Tmp_Sql);

//新增 WITM='3'
Tmp_WITM = "3";
Tmp_STP = "組裝";
Tmp_WHR = V20107BAPIController.get_STDHR(par_PN, Tmp_WITM, par_DEP12);
Tmp_WHR_Str = Tmp_WHR.ToString();
Tmp_Sql = " INSERT INTO AMM_WKSTPD "
+ " ( MITM,WITM,STP,"
+ " AQTY,PQTY,WHR,ENER,ENDT) "
+ " VALUES "
+ " (" + myfunc.AA(Tmp_MITM) + "," + myfunc.AA(Tmp_WITM) + "," + myfunc.AA(Tmp_STP) + ","
+ myfunc.AA(Tmp_AQTY) + "," + myfunc.AA(Tmp_PQTY) + "," + myfunc.AA(Tmp_WHR_Str) + ","
+ myfunc.AA(Tmp_ENER) + "," + myfunc.AA(Tmp_ENDT) + ") ";
par_SQLStringList.Add(Tmp_Sql);

//新增 WITM='4'
Tmp_WITM = "4";
Tmp_STP = "完工測試";
Tmp_WHR = V20107BAPIController.get_STDHR(par_PN, Tmp_WITM, par_DEP12);
Tmp_WHR_Str = Tmp_WHR.ToString();
Tmp_Sql = " INSERT INTO AMM_WKSTPD "
+ " ( MITM,WITM,STP,"
+ " AQTY,PQTY,WHR,ENER,ENDT) "
+ " VALUES "
+ " (" + myfunc.AA(Tmp_MITM) + "," + myfunc.AA(Tmp_WITM) + "," + myfunc.AA(Tmp_STP) + ","
+ myfunc.AA(Tmp_AQTY) + "," + myfunc.AA(Tmp_PQTY) + "," + myfunc.AA(Tmp_WHR_Str) + ","
+ myfunc.AA(Tmp_ENER) + "," + myfunc.AA(Tmp_ENDT) + ") ";
par_SQLStringList.Add(Tmp_Sql);
}



2022年10月23日 星期日

V20107D - Email - 附加檔案 - xlsx 檔案 - V30702E - 單純Email,未附加檔案

 目的: V20107D - Email 附加檔案 - *.xlsx 檔案

處理說明: 1>產生 *.xlsx 檔案 , 並產生網路路徑檔案
                      Workbook wk = new Workbook();
                      Worksheet sheet1 = wk.Worksheets[0];//獲取第一個工作表
                                   :
                      sheet1.Range[myfunc.GetExcelPos(0, i + 1)].Text = reader["DEPID"].ToString();
                                 :                       
                      // 取得實實的路徑            
                         string documentPath = HttpContext.Current.Server.MapPath("~") + "document\\";                                    string FileName1 = documentPath + par_FName;
                         wk.SaveToFile(FileName1, FileFormat.Version2007);
                
                  2>Email 處理: 附加檔案 - 以完整檔案路徑檔名 , 附加檔案
                      MailMessage ChkMail = new MailMessage();
                      ChkMail.To.add("xxx@xxxx") ;
                     string mail_from = "tlsapp@ms.aidc.com.tw";
                ChkMail.From = new MailAddress(mail_from, "AMM系統", System.Text.Encoding.UTF8);
                string subject = "AMM V20107 工作步序資料維護 - 工時不完整(=0)";
                string content = "附檔內的件號工作步序資料不完整<br>"
                                          + "請至 AMM V20107維護工作步序資料<br>";

ContentType ct = new ContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
                Attachment attm = new Attachment(Tmp_FName, ct);
                ChkMail.Attachments.Add(attm);

                sendMail(subject, content, ChkMail);  //baseAPIController




1>*.js
//[MAIL通知]鈕
function MAILNotifyBtn_click() {
var np = {};
np = {};
Ext.Ajax.request({
url: '../../api/V20107DAPI/DoMAIL',

method: 'POST',
async: false,
//standardSubmit: true, //若要傳送檔案至前端, standardSubmit必需設為 true
params: np,
success: function (response, opts) {
var Tmp_Obj = Ext.decode(response.responseText);
if (Tmp_Obj["success"] == false) {
var Tmp_Rtn_Msg = "EMAIL通知人員失敗!!<br>"
+ "請檢核<br>"
+ Tmp_Obj["Rtn_Msg"];
mywarnalert(Tmp_Rtn_Msg);
return;
}
else {
var Tmp_Rtn_Msg = "EMAIL通知人員成功!!<br>";
mysuccessalert(Tmp_Rtn_Msg);
}
}
});
} // end of function MAILNotifyBtn_click() {


2>*.cs
// [MAIL通知] - DoMAIL

        [HttpPost]
        public HttpResponseMessage DoMAIL()
        {
            //取得參數值
            var c = HttpContext.Current;
            NameValueCollection nvc = c.Request.Form;
            
            string Tmp_USERID = LoginUserModel.LoginUserId;            
            string Tmp_RtnMsg = "";
            string To_Adr = "";
            string n = funId + "_DoMAIL";
            OracleConnection conn = new OracleConnection(DBService.ConnectionString(DBLINK));
            OracleCommand cmd = new OracleCommand();
            OracleDataReader reader;

            var response = Request.CreateResponse();
            MailMessage ChkMail = new MailMessage();
            try
            {
                conn.Open();
                conn.ClientInfo = User.Identity.Name;
                conn.ModuleName = BaseSYS + "_" + BaseMODID;
                conn.ActionName = ActionName;
                cmd.BindByName = true;
                cmd.Connection = conn;
                string Tmp_Sql;
                int Tmp_cnt=0;
                Tmp_Sql = "  SELECT COUNT(*)  "
                                +"   FROM   AMM_WKSTP A, AMM_WKSTPD B  "
                                +"   WHERE A.MITM = B.MITM  "
                                +"   AND      (B.WHR = '0' OR B.WHR IS NULL)  "
                                +"  AND        SUBSTR(DEPID,1,2) = ( SELECT SUBSTR(DEPID, 1, 2)  "
                                +                                                        "   FROM   HR_EMPLYM  "
                                +                                                        "  WHERE  EMPLYID = "+myfunc.AA(Tmp_USERID)+") ";
                Tmp_cnt = int.Parse(myfunc.SqlValue(Tmp_Sql));
                if (Tmp_cnt==0)
                {
                    Tmp_RtnMsg = "目前登入使用者(" + Tmp_USERID + ")的部門相關工作步序資料<br>"
                                             + "工時資料均完整 ( 工時>0 ) <br>"
                                             + "不需 MAIL 通知相關人員";                                             
                    response.Content = new StringContent("{'success': false,'Rtn_Msg':'" + Tmp_RtnMsg + "'}");    // 回應內容
                    return response;
                }
                //填寫 Email.From, To, subject, BODY
                Tmp_Sql= "  SELECT A.EMPLYID,B.NOTES_MAIL  "
                               +"   FROM AMM_MAILIST A, HR_EMPLYM B  "
                               +"   WHERE A.EMPLYID = B.EMPLYID  "
                               +"   AND A.DEPID = ( SELECT   SUBSTR(DEPID, 1, 2)  "
                               +                               "   FROM    HR_EMPLYM  "
                               +                               "   WHERE  EMPLYID ="+myfunc.AA(Tmp_USERID)+" ) ";
                cmd.CommandText = Tmp_Sql;
                reader = cmd.ExecuteReader();
                if (reader.HasRows)
                {
                    while (reader.Read())
                    {
                        ChkMail.To.Add(reader["NOTES_MAIL"].ToString());
                    }
                };                
                string mail_from = "tlsapp@ms.aidc.com.tw";
                ChkMail.From = new MailAddress(mail_from, "AMM系統", System.Text.Encoding.UTF8);//發送者 
                string subject = "AMM V20107 工作步序資料維護 - 工時不完整(=0)";
                string content = "附檔內的件號工作步序資料不完整<br>"
                                          + "請至 AMM V20107維護工作步序資料<br>";
                //產生 *.xls 檔案
                string Tmp_FName = "V20107工作步序資料維護.xlsx";            
                Tmp_FName = ExportFile1(Tmp_FName);

                //附加檔案處理
                ContentType ct = new ContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
                Attachment attm = new Attachment(Tmp_FName, ct);
                ChkMail.Attachments.Add(attm);


                sendMail(subject, content, ChkMail);
                response.StatusCode = HttpStatusCode.OK;
                Tmp_RtnMsg = "已 Email 通知相關人員 !!  <br>";
                response.Content = new StringContent("{'success': true,'Rtn_Msg':'" + Tmp_RtnMsg + "'}");    // 回應內容
                return response;
                //excuteSQLTran
            }  //try
            catch (Exception e)
            {
                string Tmp_msg;
                Tmp_msg = myfunc.Get1ORA(e.Message);
                Tmp_RtnMsg = "Email 通知失敗<br>"
                                         + Tmp_msg;
                response.Content = new StringContent("{'success': false,'Rtn_Msg':'" + Tmp_RtnMsg + "'}");    // 回應內容
                return response;
            }
            finally
            {
                conn.Close();
            }
        }  // end of DoMAIL


//產生 Email 附件檔案  , 傳回檔名
        public string ExportFile1(string par_FName)
        {
            OracleConnection conn = new OracleConnection(DBService.ConnectionString(DBLINK));
            OracleCommand cmd = new OracleCommand();
            OracleDataReader reader;
            string Tmp_USERID = LoginUserModel.LoginUserId;
            Workbook wk = new Workbook();
            MemoryStream stream = new MemoryStream();
            try
            {
                conn.Open();
                conn.ClientInfo = User.Identity.Name;
                conn.ModuleName = BaseSYS + "_" + BaseMODID;
                conn.ActionName = ActionName;
                cmd.BindByName = true;
                cmd.Connection = conn;
                string Tmp_Sql;
                //wk = new Workbook();
                Worksheet sheet1 = wk.Worksheets[0];//獲取第一個工作表
                string[] outFieldArray = { "部門編號", "工作中心", "EO_ECN", "情況處理碼", "件號",
                                                             "中文名稱","英文名稱","料號","建檔人員","建檔日期"};
                for (int i = 0; i < outFieldArray.Length; i++)
                {
                    sheet1.Range[myfunc.GetExcelPos(i, 0)].Text = outFieldArray[i];
                }
                //填寫 Email.From, To, subject, BODY
                Tmp_Sql = "  SELECT  DISTINCT A.DEPID , A.WC , A.ECNO , A.CNDPROCCODE , A.PN , "
                                                + "  A.CNM , A.ENM , A.NSN , A.ENER , A.ENDT  "
                                 + " FROM     AMM_WKSTP A, AMM_WKSTPD B  "
                                + "  WHERE   A.MITM = B.MITM  "
                                + " AND        (B.WHR = '0' OR B.WHR IS NULL)   "
                               + "  AND        SUBSTR(DEPID,1,2) = (  SELECT SUBSTR(DEPID, 1, 2)  "
                                                                                        + "   FROM HR_EMPLYM  "
                                                                                        + "   WHERE EMPLYID = " + myfunc.AA(Tmp_USERID) + " ) ";
                cmd.CommandText = Tmp_Sql;
                reader = cmd.ExecuteReader();
                if (reader.HasRows)
                {
                    int i = 0;
                    while (reader.Read())
                    {
                        sheet1.Range[myfunc.GetExcelPos(0, i + 1)].Text = reader["DEPID"].ToString();
                        sheet1.Range[myfunc.GetExcelPos(1, i + 1)].Text = reader["WC"].ToString();
                        sheet1.Range[myfunc.GetExcelPos(2, i + 1)].Text = reader["ECNO"].ToString();
                        sheet1.Range[myfunc.GetExcelPos(3, i + 1)].Text = reader["CNDPROCCODE"].ToString();
                        sheet1.Range[myfunc.GetExcelPos(4, i + 1)].Text = reader["PN"].ToString();
                        sheet1.Range[myfunc.GetExcelPos(5, i + 1)].Text = reader["CNM"].ToString();
                        sheet1.Range[myfunc.GetExcelPos(6, i + 1)].Text = reader["ENM"].ToString();
                        sheet1.Range[myfunc.GetExcelPos(7, i + 1)].Text = reader["NSN"].ToString();
                        sheet1.Range[myfunc.GetExcelPos(8, i + 1)].Text = reader["ENER"].ToString();
                        if (!myfunc.checkisnull(reader["ENDT"].ToString()))
                        { sheet1.Range[myfunc.GetExcelPos(9, i + 1)].Text = String.Format("{0:yyyy/MM/dd}", DateTime.Parse(reader["ENDT"].ToString())); };
                        i = i + 1;
                    }  // end  of while (reader.Read())
                } // end of  if reader.HasRows
                sheet1.AllocatedRange.AutoFitColumns();
                wk.SaveToStream(stream, FileFormat.Version2007);
                string documentPath = HttpContext.Current.Server.MapPath("~") + "document\\";  // 取得實實的路徑            
                string FileName1 = documentPath + par_FName;
                wk.SaveToFile(FileName1, FileFormat.Version2007);
                return FileName1;
            }// end of try{
            finally
            {
                conn.Close();
                wk.Dispose();
            }
        }  // end of  ExportFile1

2>V30702E.cs
    Tmp_Sql = "  SELECT  * "
                   + "   FROM    AMM_DSPHCAR   "
                   + "  WHERE   TASKNO=" + myfunc.AA(Tmp_TASKNO);
    Tmp_dt0 = myfunc.SqlOpen(Tmp_dt0, Tmp_Sql);
    MailMessage ChkMail = new MailMessage();
    string mail_from = "tlsapp@ms.aidc.com.tw";
    ChkMail.From = new MailAddress(mail_from, "AMM系統", System.Text.Encoding.UTF8);
    Tmp_Sql = "  SELECT   B.NOTES_MAIL  "
                   + "   FROM    HR_EMPLYM B  "
                   + "   WHERE  B.EMPLYID = " + myfunc.AA(Tmp_dt0.Rows[0]["RQMAN"].ToString());
    string Tmp_toMail = myfunc.SqlValue(Tmp_Sql);
    ChkMail.To.Add(Tmp_toMail);                                
    string subject = "地裝派遣單剔退通知  - 派遣單號("+ Tmp_TASKNO+")";
    string content = "地裝派遣單已剔退<br>"
                           + "派遣單號:" + Tmp_TASKNO + "<br>"
                           + "請至系統修正後再提出!!<br>"
                           +"<br>"
                           + "詳細內容如下:<br>"
                           + "派遣單號:" + myfunc.AA(Tmp_TASKNO) + "<br>"
                           + "需求人:" + myfunc.AA(Tmp_dt0.Rows[0]["RQMAN"].ToString()) + "<br>"
                           + "需求日期:" + myfunc.AA(Tmp_dt0.Rows[0]["RQDT"].ToString()) + "<br>"
                           + "需求單位:" + myfunc.AA(Tmp_dt0.Rows[0]["RQDEP"].ToString()) + "<br>"
                           + "起點:" + myfunc.AA(Tmp_dt0.Rows[0]["STLC"].ToString()) + "<br>"
                           + "迄點:" + myfunc.AA(Tmp_dt0.Rows[0]["EDLC"].ToString()) + "<br>"
                    + "工作簡述:" + myfunc.AA(Tmp_dt0.Rows[0]["TASKREMARK"].ToString()) + "<br>"
                            + "剔退原因:" + myfunc.AA(Tmp_DELCAUSE) + "<br>"
                            + "剔退人員:" + myfunc.AA(Tmp_DELMAN) + "<br>";
                sendMail(subject, content, ChkMail);
       Tmp_RtnMsg = "地裝派遣單號(" + Tmp_TASKNO + ")已[剔退]完成  &  Email 原需求人員 !!";

MIME - content-type

網址:  https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types

目的:  取得正式的 MIME  文件的 content-type

Two primary MIME types are important for the role of default types:

  • text/plain is the default value for textual files. A textual file should be human-readable and must not contain binary data.
  • application/octet-stream is the default value for all other cases. An unknown file type should use this type. Browsers pay a particular care when manipulating these files, to protect users from software vulnerabilities and possible dangerous behavior.
ExtensionKind of documentMIME Type
.aacAAC audioaudio/aac
.abwAbiWord documentapplication/x-abiword
.arcArchive document (multiple files embedded)application/x-freearc
.avifAVIF imageimage/avif
.aviAVI: Audio Video Interleavevideo/x-msvideo
.azwAmazon Kindle eBook formatapplication/vnd.amazon.ebook
.binAny kind of binary dataapplication/octet-stream
.bmpWindows OS/2 Bitmap Graphicsimage/bmp
.bzBZip archiveapplication/x-bzip
.bz2BZip2 archiveapplication/x-bzip2
.cdaCD audioapplication/x-cdf
.cshC-Shell scriptapplication/x-csh
.cssCascading Style Sheets (CSS)text/css
.csvComma-separated values (CSV)text/csv
.docMicrosoft Wordapplication/msword
.docxMicrosoft Word (OpenXML)application/vnd.openxmlformats-officedocument.wordprocessingml.document
.eotMS Embedded OpenType fontsapplication/vnd.ms-fontobject
.epubElectronic publication (EPUB)application/epub+zip
.gzGZip Compressed Archiveapplication/gzip
.gifGraphics Interchange Format (GIF)image/gif
.htm .htmlHyperText Markup Language (HTML)text/html
.icoIcon formatimage/vnd.microsoft.icon
.icsiCalendar formattext/calendar
.jarJava Archive (JAR)application/java-archive
.jpeg .jpgJPEG imagesimage/jpeg
.jsJavaScripttext/javascript (Specifications: HTML and RFC 9239)
.jsonJSON formatapplication/json
.jsonldJSON-LD formatapplication/ld+json
.mid .midiMusical Instrument Digital Interface (MIDI)audio/midi audio/x-midi
.mjsJavaScript moduletext/javascript
.mp3MP3 audioaudio/mpeg
.mp4MP4 videovideo/mp4
.mpegMPEG Videovideo/mpeg
.mpkgApple Installer Packageapplication/vnd.apple.installer+xml
.odpOpenDocument presentation documentapplication/vnd.oasis.opendocument.presentation
.odsOpenDocument spreadsheet documentapplication/vnd.oasis.opendocument.spreadsheet
.odtOpenDocument text documentapplication/vnd.oasis.opendocument.text
.ogaOGG audioaudio/ogg
.ogvOGG videovideo/ogg
.ogxOGGapplication/ogg
.opusOpus audioaudio/opus
.otfOpenType fontfont/otf
.pngPortable Network Graphicsimage/png
.pdfAdobe Portable Document Format (PDF)application/pdf
.phpHypertext Preprocessor (Personal Home Page)application/x-httpd-php
.pptMicrosoft PowerPointapplication/vnd.ms-powerpoint
.pptxMicrosoft PowerPoint (OpenXML)application/vnd.openxmlformats-officedocument.presentationml.presentation
.rarRAR archiveapplication/vnd.rar
.rtfRich Text Format (RTF)application/rtf
.shBourne shell scriptapplication/x-sh
.svgScalable Vector Graphics (SVG)image/svg+xml
.tarTape Archive (TAR)application/x-tar
.tif .tiffTagged Image File Format (TIFF)image/tiff
.tsMPEG transport streamvideo/mp2t
.ttfTrueType Fontfont/ttf
.txtText, (generally ASCII or ISO 8859-n)text/plain
.vsdMicrosoft Visioapplication/vnd.visio
.wavWaveform Audio Formataudio/wav
.webaWEBM audioaudio/webm
.webmWEBM videovideo/webm
.webpWEBP imageimage/webp
.woffWeb Open Font Format (WOFF)font/woff
.woff2Web Open Font Format (WOFF)font/woff2
.xhtmlXHTMLapplication/xhtml+xml
.xlsMicrosoft Excelapplication/vnd.ms-excel
.xlsxMicrosoft Excel (OpenXML)application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
.xmlXMLapplication/xml is recommended as of RFC 7303 (section 4.1), but text/xml is still used sometimes. You can assign a specific MIME type to a file with .xml extension depending on how its contents are meant to be interpreted. For instance, an Atom feed is application/atom+xml, but application/xml serves as a valid default.
.xulXULapplication/vnd.mozilla.xul+xml
.zipZIP archiveapplication/zip
.3gp3GPP audio/video containervideo/3gppaudio/3gpp if it doesn't contain video
.3g23GPP2 audio/video containervideo/3gpp2audio/3gpp2 if it doesn't contain video
.7z7-zip archiveapplication/x-7z-compressed