SQL語法與程式記憶體調整(調配)-藉此降地SQL負載+進而提升系統整體運算速度

SQL語法與程式記憶體調整(調配)-藉此降地SQL負載+進而提升系統整體運算速度

SQL語法與程式記憶體調整(調配)-藉此降地SQL負載+進而提升系統整體運算速度

 

思路整理:
    01.把所有單一SELECT語法加上LIMIT 0,1
    02.把所有迴圈包覆的SQL中的WHERE全部改成集合模式 [ IN(….)型式 ]
    03.把固定資料[door和控制器]的查詢動作結果存放在記憶體中,當要再執行查尋時先和之前記憶體變數做比對

 

public void calculate_saveDB()
{
    /*
    CREATE TABLE IF NOT EXISTS `authorization_data` (
      `card_id` int(11) NOT NULL,
      `door_id` int(11) NOT NULL,
      `type` int(11) NOT NULL DEFAULT ‘0’,
      `block` varchar(10) NOT NULL DEFAULT ‘0,0,0’,
      `level` int(11) NOT NULL DEFAULT ‘1’,
      `access_time_1_start` time NOT NULL DEFAULT ’00:00:00′,
      `access_time_1_end` time NOT NULL DEFAULT ’23:59:00′,
      `access_time_2_start` time NOT NULL DEFAULT ’00:00:00′,
      `access_time_2_end` time NOT NULL DEFAULT ’00:00:00′,
      `access_time_3_start` time NOT NULL DEFAULT ’00:00:00′,
      `access_time_3_end` time NOT NULL DEFAULT ’00:00:00′,
      `week_plan` int(11) NOT NULL DEFAULT ‘0’,
      `available_date_start` varchar(25) NOT NULL DEFAULT ‘now’,
      `available_date_end` varchar(25) NOT NULL DEFAULT ‘forever’,
      PRIMARY KEY (`card_id`,`door_id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
    */

    
    //A0    ->  m_ALDoor;
    //A1    ->  m_ALCard;
    //A2    ->  m_aData;
    //A3    ->  db_AnsData
    //B=(A1 聯集運算 A3) 或 A1 
    //Ans=B

    //—
    //修正運算授權結果用Filter方法-運算函數修正
    if (m_intRun == -1)//單純創造授權群組,並未實際配發
    {
        return;
    }
    //—

    String SQL = “”;
    for (int i = 0; i < m_ALCard.Count; i++)//依序取出卡資料 A1
    {
        for (int j = 0; j < m_ALDoor.Count; j++)//依序取出門資料 A0
        {
            //—
            //製作授權等待動畫
            m_intAuthorizationStep = 1;
            m_dblAuthorizationNow++;
            //—製作授權等待動畫

            //————————
            //取出DB-先前派送 [db_AnsData]
            cData bufcData = (cData)m_ALCard[i];
            dData bufdData = (dData)m_ALDoor[j];
            AnsData db_AnsData = new AnsData();//取出對應 A3
            SQL = String.Format(“SELECT * FROM authorization_data WHERE card_id={0} AND door_id={1} LIMIT 0,1;”, bufcData.StrID, bufdData.StrID);
            MySqlDataReader Reader_Data00 = MySQL.GetDataReader(SQL);
            while (Reader_Data00.Read())
            {
                db_AnsData.state = 1;//確定之前有設定過
                db_AnsData.Strcard_id = Reader_Data00[0].ToString();
                db_AnsData.Strdoor_id = Reader_Data00[1].ToString();
                db_AnsData.Strtype = Reader_Data00[2].ToString();
                db_AnsData.Strblock = Reader_Data00[3].ToString();
                db_AnsData.Strlevel = Reader_Data00[4].ToString();
                db_AnsData.Straccess_time_1_start = Reader_Data00[5].ToString();
                db_AnsData.Straccess_time_1_end = Reader_Data00[6].ToString();
                db_AnsData.Straccess_time_2_start = Reader_Data00[7].ToString();
                db_AnsData.Straccess_time_2_end = Reader_Data00[8].ToString();
                db_AnsData.Straccess_time_3_start = Reader_Data00[9].ToString();
                db_AnsData.Straccess_time_3_end = Reader_Data00[10].ToString();
                db_AnsData.Strweek_plan = Reader_Data00[11].ToString();
                db_AnsData.Stravailable_date_start = Reader_Data00[12].ToString();
                db_AnsData.Stravailable_date_end = Reader_Data00[13].ToString();
                break;
            }
            Reader_Data00.Close(); 
            //————————

            //—
            //修正運算授權結果用Filter方法-運算函數修正
            AnsData B_AnsData = new AnsData();//B
            if (m_aData.Straction == “1”)//依照授權參數決定是增加還是刪出
            {
                B_AnsData.state = 1;//授權
            }
            else
            {
                B_AnsData.state = -1;//撤銷授權
            }

            B_AnsData.Strcard_id = bufcData.StrID;
            B_AnsData.Strdoor_id = bufdData.StrID;
            B_AnsData.flag = bufcData.flag;
            B_AnsData.Straccess_time_1_start = bufcData.StrAtime_S1;
            B_AnsData.Straccess_time_1_end = bufcData.StrAtime_E1;
            B_AnsData.Straccess_time_2_start = bufcData.StrAtime_S2;
            B_AnsData.Straccess_time_2_end = bufcData.StrAtime_E2;
            B_AnsData.Straccess_time_3_start = bufcData.StrAtime_S3;
            B_AnsData.Straccess_time_3_end = bufcData.StrAtime_E3;
            B_AnsData.Stravailable_date_start = bufcData.StrTime_S;
            B_AnsData.Stravailable_date_end = bufcData.StrTime_E;
            B_AnsData.Strblock = bufcData.StrBlock;
            B_AnsData.Strlevel = bufcData.StrLevel;
            B_AnsData.Strtype = bufcData.StrType;
            B_AnsData.Strweek_plan = bufcData.StrWeekPlan;

            if ( (m_intRunType == 1) && (db_AnsData.state > -2) )// 1 合併
            {
                if (Convert.ToUInt32(db_AnsData.Strtype) > Convert.ToUInt32(B_AnsData.Strtype))//type 合併取大值
                {
                    B_AnsData.Strtype = db_AnsData.Strtype;
                }

                if (Convert.ToUInt32(db_AnsData.Strlevel) > Convert.ToUInt32(B_AnsData.Strlevel))//level 合併取大值
                {
                    B_AnsData.Strlevel = db_AnsData.Strlevel;
                }

                int a, b, c;
                int e, f, g;
                string[] strs00 = db_AnsData.Strblock.Split(‘,’);
                a = Convert.ToInt32(strs00[0], 10);
                b = Convert.ToInt32(strs00[1], 10);
                c = Convert.ToInt32(strs00[2], 10);
                string[] strs01 = B_AnsData.Strblock.Split(‘,’);
                e = Convert.ToInt32(strs01[0], 10);
                f = Convert.ToInt32(strs01[1], 10);
                g = Convert.ToInt32(strs01[2], 10);
                if (a > e)//block 合併取大值
                {
                    e = a;
                }
                if (b > f)//block 合併取大值
                {
                    f = b;
                }
                if (c > g)//block 合併取大值
                {
                    g = c;
                }
                B_AnsData.Strblock = “” + e + “,” + f + “,” + g;//block 合併取大值

                CalculatePassTime buf_CalculatePassTime = new CalculatePassTime();//合併通行時段
                buf_CalculatePassTime.SetInput(db_AnsData.Straccess_time_1_start, db_AnsData.Straccess_time_1_end, true);
                buf_CalculatePassTime.SetInput(db_AnsData.Straccess_time_2_start, db_AnsData.Straccess_time_2_end, true);
                buf_CalculatePassTime.SetInput(db_AnsData.Straccess_time_3_start, db_AnsData.Straccess_time_3_end, true);
                //—-
                //不分是否是撤銷或新增授權在計算通行時段都用加法運算
                /*
                if (B_AnsData.state == 1)//授權
                {
                    buf_CalculatePassTime.SetInput(B_AnsData.Straccess_time_1_start, B_AnsData.Straccess_time_1_end, true);
                    buf_CalculatePassTime.SetInput(B_AnsData.Straccess_time_2_start, B_AnsData.Straccess_time_2_end, true);
                    buf_CalculatePassTime.SetInput(B_AnsData.Straccess_time_3_start, B_AnsData.Straccess_time_3_end, true);
                }
                else if (B_AnsData.state == -1)//撤銷//授權
                {
                    buf_CalculatePassTime.SetInput(B_AnsData.Straccess_time_1_start, B_AnsData.Straccess_time_1_end, false);
                    buf_CalculatePassTime.SetInput(B_AnsData.Straccess_time_2_start, B_AnsData.Straccess_time_2_end, false);
                    buf_CalculatePassTime.SetInput(B_AnsData.Straccess_time_3_start, B_AnsData.Straccess_time_3_end, false);
                }
                */
                buf_CalculatePassTime.SetInput(B_AnsData.Straccess_time_1_start, B_AnsData.Straccess_time_1_end, true);
                buf_CalculatePassTime.SetInput(B_AnsData.Straccess_time_2_start, B_AnsData.Straccess_time_2_end, true);
                buf_CalculatePassTime.SetInput(B_AnsData.Straccess_time_3_start, B_AnsData.Straccess_time_3_end, true);
                //—-
                int count = buf_CalculatePassTime.CalOutput();
                switch (count)
                {
                    case 1:
                        B_AnsData.Straccess_time_1_start = buf_CalculatePassTime.m_StrS1;
                        B_AnsData.Straccess_time_1_end = buf_CalculatePassTime.m_StrE1;
                        B_AnsData.Straccess_time_2_start = “00:00”;
                        B_AnsData.Straccess_time_2_end = “00:00”;
                        B_AnsData.Straccess_time_3_start = “00:00”;
                        B_AnsData.Straccess_time_3_end = “00:00”;
                        break;
                    case 2:
                        B_AnsData.Straccess_time_1_start = buf_CalculatePassTime.m_StrS1;
                        B_AnsData.Straccess_time_1_end = buf_CalculatePassTime.m_StrE1;
                        B_AnsData.Straccess_time_2_start = buf_CalculatePassTime.m_StrS2;
                        B_AnsData.Straccess_time_2_end = buf_CalculatePassTime.m_StrE2;
                        B_AnsData.Straccess_time_3_start = “00:00”;
                        B_AnsData.Straccess_time_3_end = “00:00”;
                        break;
                    case 3:
                        B_AnsData.Straccess_time_1_start = buf_CalculatePassTime.m_StrS1;
                        B_AnsData.Straccess_time_1_end = buf_CalculatePassTime.m_StrE1;
                        B_AnsData.Straccess_time_2_start = buf_CalculatePassTime.m_StrS2;
                        B_AnsData.Straccess_time_2_end = buf_CalculatePassTime.m_StrE2;
                        B_AnsData.Straccess_time_3_start = buf_CalculatePassTime.m_StrS3;
                        B_AnsData.Straccess_time_3_end = buf_CalculatePassTime.m_StrE3;
                        break;
                    default:
                        B_AnsData.Straccess_time_1_start = “00:00”;
                        B_AnsData.Straccess_time_1_end = “00:00”;
                        B_AnsData.Straccess_time_2_start = “00:00”;
                        B_AnsData.Straccess_time_2_end = “00:00”;
                        B_AnsData.Straccess_time_3_start = “00:00”;
                        B_AnsData.Straccess_time_3_end = “00:00”;
                        break;
                }

                String Strbuf0, Strbuf1, Strbuf2, Strbuf3;//有效期合併 取最大範圍
                Strbuf0 = B_AnsData.Stravailable_date_start;
                Strbuf1 = B_AnsData.Stravailable_date_end;
                Strbuf2 = db_AnsData.Stravailable_date_start;
                Strbuf3 = db_AnsData.Stravailable_date_end;
                if (Strbuf0 == Strbuf1)
                {
                    Strbuf0 = “now”;
                    Strbuf1 = “forever”;
                }
                if (Strbuf2 == Strbuf3)
                {
                    Strbuf2 = “now”;
                    Strbuf3 = “forever”;
                }
                if (Strbuf0 == “now”)
                {
                    Strbuf0 = DateTime.Now.ToString(“yyyy/MM/dd HH:mm”);
                }
                if (Strbuf2 == “now”)
                {
                    Strbuf2 = DateTime.Now.ToString(“yyyy/MM/dd HH:mm”);
                }
                if (Strbuf1 == “forever”)
                {
                    Strbuf1 = Convert.ToDateTime(“2069/01/01 00:00”).ToString(“yyyy/MM/dd HH:mm”);//修正結束時間,不可超過硬體最大時間 DateTime.MaxValue.ToString(“yyyy/MM/dd HH:mm”);
                }
                if (Strbuf3 == “forever”)
                {
                    Strbuf3 = Convert.ToDateTime(“2069/01/01 00:00”).ToString(“yyyy/MM/dd HH:mm”);//修正結束時間,不可超過硬體最大時間 DateTime.MaxValue.ToString(“yyyy/MM/dd HH:mm”);
                }
                if (DateTime.Compare(Convert.ToDateTime(Strbuf0), Convert.ToDateTime(Strbuf2)) > 0)//取小
                {
                    B_AnsData.Stravailable_date_start = Strbuf2;
                }
                else
                {
                    B_AnsData.Stravailable_date_start = Strbuf0;
                }
                if (DateTime.Compare(Convert.ToDateTime(Strbuf1), Convert.ToDateTime(Strbuf3)) > 0)//取大
                {
                    B_AnsData.Stravailable_date_end = Strbuf1;
                }
                else
                {
                    B_AnsData.Stravailable_date_end = Strbuf3;
                }

                B_AnsData.Strweek_plan = Convert.ToString(Convert.ToInt32(B_AnsData.Strweek_plan) | Convert.ToInt32(db_AnsData.Strweek_plan));//周計畫合併 取最大值
            }//合併結束

            //—
            //實作-單純只考慮人群參數+卡片參數和是否合併之前傳送參數的運算結果寫入DB
            SQL = String.Format(“DELETE FROM authorization_data WHERE card_id={0} AND door_id={1};”, B_AnsData.Strcard_id, B_AnsData.Strdoor_id);//先刪除原本DB資料
            MySQL.InsertUpdateDelete(SQL);
            SQL = String.Format(“INSERT INTO authorization_data (card_id, door_id, type, block, level, access_time_1_start, access_time_1_end, access_time_2_start, access_time_2_end, access_time_3_start, access_time_3_end, week_plan, available_date_start, available_date_end, state) VALUES (‘{0}’, ‘{1}’, ‘{2}’, ‘{3}’, ‘{4}’, ‘{5}’, ‘{6}’, ‘{7}’, ‘{8}’, ‘{9}’, ‘{10}’, ‘{11}’, ‘{12}’, ‘{13}’, ‘{14}’);”
            , B_AnsData.Strcard_id, B_AnsData.Strdoor_id, B_AnsData.Strtype, B_AnsData.Strblock, B_AnsData.Strlevel, B_AnsData.Straccess_time_1_start, B_AnsData.Straccess_time_1_end, B_AnsData.Straccess_time_2_start, B_AnsData.Straccess_time_2_end, B_AnsData.Straccess_time_3_start, B_AnsData.Straccess_time_3_end, B_AnsData.Strweek_plan, B_AnsData.Stravailable_date_start, B_AnsData.Stravailable_date_end, B_AnsData.state);
            MySQL.InsertUpdateDelete(SQL);
            //—

            /*//停用授權運算中門區參數當過濾器功能
            //Filter
            bool[] blnFilter = new bool[3];//passtime,level,week_plan
            for(int k=0;k<blnFilter.Length;k++)
            {
                blnFilter[k] = false;
            }

            //Filter-通行時段
            String[] S_time = new String[3];
            String[] E_time = new String[3];
            S_time[0] = B_AnsData.Straccess_time_1_start;
            S_time[1] = B_AnsData.Straccess_time_2_start;
            S_time[2] = B_AnsData.Straccess_time_3_start;
            E_time[0] = B_AnsData.Straccess_time_1_end;
            E_time[1] = B_AnsData.Straccess_time_2_end;
            E_time[2] = B_AnsData.Straccess_time_3_end;
            String[] dS_time = new String[8];
            String[] dE_time = new String[8];
            dS_time[0] = bufdData.StrAtime_S1;
            dS_time[1] = bufdData.StrAtime_S2;
            dS_time[2] = bufdData.StrAtime_S3;
            dS_time[3] = bufdData.StrAtime_S4;
            dS_time[4] = bufdData.StrAtime_S5;
            dS_time[5] = bufdData.StrAtime_S6;
            dS_time[6] = bufdData.StrAtime_S7;
            dS_time[7] = bufdData.StrAtime_S8;
            dE_time[0] = bufdData.StrAtime_E1;
            dE_time[1] = bufdData.StrAtime_E2;
            dE_time[2] = bufdData.StrAtime_E3;
            dE_time[3] = bufdData.StrAtime_E4;
            dE_time[4] = bufdData.StrAtime_E5;
            dE_time[5] = bufdData.StrAtime_E6;
            dE_time[6] = bufdData.StrAtime_E7;
            dE_time[7] = bufdData.StrAtime_E8;
            for (int k = 0; k < S_time.Length; k++)
            {
                for (int l = 0; l < dS_time.Length; l++)
                {
                    if( DateTime.Compare(Convert.ToDateTime(dS_time[l]),Convert.ToDateTime(S_time[k]))<=0 && DateTime.Compare(Convert.ToDateTime(dE_time[l]),Convert.ToDateTime(S_time[k]))>0 )
                    {
                        blnFilter[0]=true;
                        break;
                    }
                }
                if(blnFilter[0]==true)
                {
                    break;
                }
            }
            //Filter-等級
            if ((Convert.ToInt32(bufdData.StrLevel) – Convert.ToInt32(B_AnsData.Strlevel)) <= 0)
            {
                blnFilter[1] = true;
            }
            //Filter-周計畫
            if ((Convert.ToInt32(bufdData.StrWeekPlan) & Convert.ToInt32(B_AnsData.Strweek_plan)) > 0)
            {
                blnFilter[2] = true;
            }
            //—
            */ 

            /*
            *修正運算授權結果用Filter方法-停用之前演算法
            //————————
            //計算(A0|A1)
            AnsData A0A1_AnsData = new AnsData();

            if (m_aData.Straction == “1”)//依照授權參數決定是增加還是刪出
            {
                A0A1_AnsData.state = 1;
            }
            else
            {
                A0A1_AnsData.state = -1;
            }

            A0A1_AnsData.Strcard_id = bufcData.StrID;
            A0A1_AnsData.Strdoor_id = bufdData.StrID;

            CalculatePassTime buf_CalculatePassTime = new CalculatePassTime();
            buf_CalculatePassTime.SetInput(bufcData.StrAtime_S1, bufcData.StrAtime_E1, true);
            buf_CalculatePassTime.SetInput(bufcData.StrAtime_S2, bufcData.StrAtime_E2, true);
            buf_CalculatePassTime.SetInput(bufcData.StrAtime_S3, bufcData.StrAtime_E3, true);
            buf_CalculatePassTime.SetInput(bufdData.StrAtime_S1, bufdData.StrAtime_E1, true);
            buf_CalculatePassTime.SetInput(bufdData.StrAtime_S2, bufdData.StrAtime_E2, true);
            buf_CalculatePassTime.SetInput(bufdData.StrAtime_S3, bufdData.StrAtime_E3, true);
            buf_CalculatePassTime.SetInput(bufdData.StrAtime_S4, bufdData.StrAtime_E4, true);
            buf_CalculatePassTime.SetInput(bufdData.StrAtime_S5, bufdData.StrAtime_E5, true);
            buf_CalculatePassTime.SetInput(bufdData.StrAtime_S6, bufdData.StrAtime_E6, true);
            buf_CalculatePassTime.SetInput(bufdData.StrAtime_S7, bufdData.StrAtime_E7, true);
            buf_CalculatePassTime.SetInput(bufdData.StrAtime_S8, bufdData.StrAtime_E8, true);
            int count = buf_CalculatePassTime.CalOutput();
            switch (count)
            {
                case 1:
                    A0A1_AnsData.Straccess_time_1_start = buf_CalculatePassTime.m_StrS1;
                    A0A1_AnsData.Straccess_time_1_end = buf_CalculatePassTime.m_StrE1;
                    A0A1_AnsData.Straccess_time_2_start = “00:00”;
                    A0A1_AnsData.Straccess_time_2_end = “00:00”;
                    A0A1_AnsData.Straccess_time_3_start = “00:00”;
                    A0A1_AnsData.Straccess_time_3_end = “00:00”;
                    break;
                case 2:
                    A0A1_AnsData.Straccess_time_1_start = buf_CalculatePassTime.m_StrS1;
                    A0A1_AnsData.Straccess_time_1_end = buf_CalculatePassTime.m_StrE1;
                    A0A1_AnsData.Straccess_time_2_start = buf_CalculatePassTime.m_StrS2;
                    A0A1_AnsData.Straccess_time_2_end = buf_CalculatePassTime.m_StrE2;
                    A0A1_AnsData.Straccess_time_3_start = “00:00”;
                    A0A1_AnsData.Straccess_time_3_end = “00:00”;
                    break;
                case 3:
                    A0A1_AnsData.Straccess_time_1_start = buf_CalculatePassTime.m_StrS1;
                    A0A1_AnsData.Straccess_time_1_end = buf_CalculatePassTime.m_StrE1;
                    A0A1_AnsData.Straccess_time_2_start = buf_CalculatePassTime.m_StrS2;
                    A0A1_AnsData.Straccess_time_2_end = buf_CalculatePassTime.m_StrE2;
                    A0A1_AnsData.Straccess_time_3_start = buf_CalculatePassTime.m_StrS3;
                    A0A1_AnsData.Straccess_time_3_end = buf_CalculatePassTime.m_StrE3;
                    break;
                default:
                    A0A1_AnsData.Straccess_time_1_start = “00:00”;
                    A0A1_AnsData.Straccess_time_1_end = “00:00”;
                    A0A1_AnsData.Straccess_time_2_start = “00:00”;
                    A0A1_AnsData.Straccess_time_2_end = “00:00”;
                    A0A1_AnsData.Straccess_time_3_start = “00:00”;
                    A0A1_AnsData.Straccess_time_3_end = “00:00”;
                    break;
            }

            String Strbuf0, Strbuf1, Strbuf2, Strbuf3;
            Strbuf0 = bufcData.StrTime_S;
            Strbuf1 = bufcData.StrTime_E;
            Strbuf2 = bufdData.StrTime_S;
            Strbuf3 = bufdData.StrTime_E;
            if (Strbuf0 == Strbuf1)
            {
                Strbuf0 = “now”;
                Strbuf1 = “forever”;
            }
            if (Strbuf2 == Strbuf3)
            {
                Strbuf2 = “now”;
                Strbuf3 = “forever”;
            }
            if (Strbuf0 == “now”)
            {
                Strbuf0 = DateTime.Now.ToString(“yyyy/MM/dd HH:mm”);
            }
            if (Strbuf2 == “now”)
            {
                Strbuf2 = DateTime.Now.ToString(“yyyy/MM/dd HH:mm”);
            }
            if (Strbuf1 == “forever”)
            {
                Strbuf1 = Convert.ToDateTime(“2069/01/01 00:00”).ToString(“yyyy/MM/dd HH:mm”);//修正結束時間,不可超過硬體最大時間 DateTime.MaxValue.ToString(“yyyy/MM/dd HH:mm”);
            }
            if (Strbuf3 == “forever”)
            {
                Strbuf3 = Convert.ToDateTime(“2069/01/01 00:00”).ToString(“yyyy/MM/dd HH:mm”);//修正結束時間,不可超過硬體最大時間 DateTime.MaxValue.ToString(“yyyy/MM/dd HH:mm”);
            }
            if (DateTime.Compare(Convert.ToDateTime(Strbuf0), Convert.ToDateTime(Strbuf2)) > 0)//取小
            {
                A0A1_AnsData.Stravailable_date_start = Strbuf2;
            }
            else
            {
                A0A1_AnsData.Stravailable_date_start = Strbuf0;
            }
            if (DateTime.Compare(Convert.ToDateTime(Strbuf1), Convert.ToDateTime(Strbuf3)) > 0)//取大
            {
                A0A1_AnsData.Stravailable_date_end = Strbuf1;
            }
            else
            {
                A0A1_AnsData.Stravailable_date_end = Strbuf3;
            }

            A0A1_AnsData.Strblock = bufcData.StrBlock;

            if (Convert.ToInt32(bufcData.StrLevel) > Convert.ToInt32(bufdData.StrLevel))
            {
                A0A1_AnsData.Strlevel = bufcData.StrLevel;
            }
            else
            {
                A0A1_AnsData.Strlevel = bufdData.StrLevel;
            }

            A0A1_AnsData.Strtype = bufcData.StrType;

            A0A1_AnsData.Strweek_plan = Convert.ToString(Convert.ToInt32(bufcData.StrWeekPlan) | Convert.ToInt32(bufdData.StrWeekPlan));
            //————————

            //————————
            //計算B=(A0|A1)&A2
            //A2    ->  m_aData;
            AnsData B_AnsData = new AnsData();
            B_AnsData = A0A1_AnsData;//預設授權參數無作用B=(A0|A1)

            if (m_aData.StrEn0 == “1”)//授權參數有作用B=(A0|A1)&A2
            {
                if (m_aData.StrEn1 == “1”)
                {
                    B_AnsData.Stravailable_date_start = m_aData.StrTime_S;
                    B_AnsData.Stravailable_date_end = m_aData.StrTime_E;
                }
                if (m_aData.StrEn2 == “1”)
                {
                    B_AnsData.Strlevel = m_aData.StrLevel;
                }
                if (m_aData.StrEn3 == “1”)
                {
                    B_AnsData.Strweek_plan = m_aData.StrWeekPlan;
                    B_AnsData.Straccess_time_1_start = m_aData.StrAtime_S1;
                    B_AnsData.Straccess_time_1_end = m_aData.StrAtime_E1;
                    B_AnsData.Straccess_time_2_start = m_aData.StrAtime_S2;
                    B_AnsData.Straccess_time_2_end = m_aData.StrAtime_E2;
                    B_AnsData.Straccess_time_3_start = m_aData.StrAtime_S3;
                    B_AnsData.Straccess_time_3_end = m_aData.StrAtime_E3;
                }
                if (m_aData.StrEn4 == “1”)
                {
                    B_AnsData.Strblock = m_aData.StrBlock;
                }
                if (m_aData.StrEn5 == “1”)
                {
                    B_AnsData.Strtype = m_aData.StrType;
                }
            }
            //————————

            //————————
            //計算Ans00=B|A3
            AnsData AnsData00 = new AnsData();
            AnsData00 = B_AnsData;//預設DB沒有對應結果

            if (db_AnsData.state != 0)//DB有上次對應結果
            {
                if (Convert.ToInt32(db_AnsData.Strtype) > Convert.ToInt32(AnsData00.Strtype))
                {
                    AnsData00.Strtype = db_AnsData.Strtype;
                }

                int a, b, c;
                int e, f, g;
                string[] strs00 = db_AnsData.Strblock.Split(‘,’);
                a = Convert.ToInt32(strs00[0], 10);
                b = Convert.ToInt32(strs00[1], 10);
                c = Convert.ToInt32(strs00[2], 10);
                string[] strs01 = AnsData00.Strblock.Split(‘,’);
                e = Convert.ToInt32(strs01[0], 10);
                f = Convert.ToInt32(strs01[1], 10);
                g = Convert.ToInt32(strs01[2], 10);
                if (a > e)
                {
                    e = a;
                }
                if (b > f)
                {
                    f = b;
                }
                if (c > g)
                {
                    g = c;
                }
                AnsData00.Strblock = “” + e + “,” + f + “,” + g;

                if (Convert.ToInt32(db_AnsData.Strlevel) > Convert.ToInt32(AnsData00.Strlevel))
                {
                    AnsData00.Strlevel = db_AnsData.Strlevel;
                }

                CalculatePassTime buf_CalculatePassTime01 = new CalculatePassTime();
                buf_CalculatePassTime01.SetInput(db_AnsData.Straccess_time_1_start, db_AnsData.Straccess_time_1_end, true);
                buf_CalculatePassTime01.SetInput(db_AnsData.Straccess_time_2_start, db_AnsData.Straccess_time_2_end, true);
                buf_CalculatePassTime01.SetInput(db_AnsData.Straccess_time_3_start, db_AnsData.Straccess_time_3_end, true);
                if (AnsData00.state == 1)
                {
                    buf_CalculatePassTime01.SetInput(AnsData00.Straccess_time_1_start, AnsData00.Straccess_time_1_end, true);
                    buf_CalculatePassTime01.SetInput(AnsData00.Straccess_time_2_start, AnsData00.Straccess_time_2_end, true);
                    buf_CalculatePassTime01.SetInput(AnsData00.Straccess_time_3_start, AnsData00.Straccess_time_3_end, true);
                }
                else
                {
                    buf_CalculatePassTime01.SetInput(AnsData00.Straccess_time_1_start, AnsData00.Straccess_time_1_end, false);
                    buf_CalculatePassTime01.SetInput(AnsData00.Straccess_time_2_start, AnsData00.Straccess_time_2_end, false);
                    buf_CalculatePassTime01.SetInput(AnsData00.Straccess_time_3_start, AnsData00.Straccess_time_3_end, false);
                }
                count = buf_CalculatePassTime01.CalOutput();
                switch (count)
                {
                    case 1:
                        AnsData00.Straccess_time_1_start = buf_CalculatePassTime01.m_StrS1;
                        AnsData00.Straccess_time_1_end = buf_CalculatePassTime01.m_StrE1;
                        AnsData00.Straccess_time_2_start = “00:00”;
                        AnsData00.Straccess_time_2_end = “00:00”;
                        AnsData00.Straccess_time_3_start = “00:00”;
                        AnsData00.Straccess_time_3_end = “00:00”;
                        break;
                    case 2:
                        AnsData00.Straccess_time_1_start = buf_CalculatePassTime01.m_StrS1;
                        AnsData00.Straccess_time_1_end = buf_CalculatePassTime01.m_StrE1;
                        AnsData00.Straccess_time_2_start = buf_CalculatePassTime01.m_StrS2;
                        AnsData00.Straccess_time_2_end = buf_CalculatePassTime01.m_StrE2;
                        AnsData00.Straccess_time_3_start = “00:00”;
                        AnsData00.Straccess_time_3_end = “00:00”;
                        break;
                    case 3:
                        AnsData00.Straccess_time_1_start = buf_CalculatePassTime01.m_StrS1;
                        AnsData00.Straccess_time_1_end = buf_CalculatePassTime01.m_StrE1;
                        AnsData00.Straccess_time_2_start = buf_CalculatePassTime01.m_StrS2;
                        AnsData00.Straccess_time_2_end = buf_CalculatePassTime01.m_StrE2;
                        AnsData00.Straccess_time_3_start = buf_CalculatePassTime01.m_StrS3;
                        AnsData00.Straccess_time_3_end = buf_CalculatePassTime01.m_StrE3;
                        break;
                    default:
                        AnsData00.Straccess_time_1_start = “00:00”;
                        AnsData00.Straccess_time_1_end = “00:00”;
                        AnsData00.Straccess_time_2_start = “00:00”;
                        AnsData00.Straccess_time_2_end = “00:00”;
                        AnsData00.Straccess_time_3_start = “00:00”;
                        AnsData00.Straccess_time_3_end = “00:00”;
                        break;
                }

                AnsData00.Strweek_plan = Convert.ToString(Convert.ToInt32(AnsData00.Strweek_plan) | Convert.ToInt32(db_AnsData.Strweek_plan)); ;

                if (DateTime.Compare(Convert.ToDateTime(AnsData00.Stravailable_date_start), Convert.ToDateTime(db_AnsData.Stravailable_date_start)) > 0)//取小
                {
                    AnsData00.Stravailable_date_start = db_AnsData.Stravailable_date_start;
                }
                else
                {
                    AnsData00.Stravailable_date_start = AnsData00.Stravailable_date_start;
                }
                if (DateTime.Compare(Convert.ToDateTime(AnsData00.Stravailable_date_end), Convert.ToDateTime(db_AnsData.Stravailable_date_end)) > 0)//取大
                {
                    AnsData00.Stravailable_date_end = AnsData00.Stravailable_date_end;
                }
                else
                {
                    AnsData00.Stravailable_date_end = db_AnsData.Stravailable_date_end;
                }

                AnsData00.state = db_AnsData.state;//表示跟DB運算過,就算原本是刪除狀態也要修正
            }
            else//沒有之前DB對應結果
            {
                if (AnsData00.state < 0)
                {
                    AnsData00.state = 0;
                }
            }
            //————————

            //————————
            //寫入DB
            if (AnsData00.state != 0)
            {
                SQL = String.Format(“DELETE FROM authorization_data WHERE card_id={0} AND door_id={1};”, AnsData00.Strcard_id, AnsData00.Strdoor_id);
                MySQL.InsertUpdateDelete(SQL);

                if (count > 0 && AnsData00.state>0)//表示有通行時段+可派送
                {
                    SQL = String.Format(“INSERT INTO authorization_data (card_id, door_id, type, block, level, access_time_1_start, access_time_1_end, access_time_2_start, access_time_2_end, access_time_3_start, access_time_3_end, week_plan, available_date_start, available_date_end) VALUES (‘{0}’, ‘{1}’, ‘{2}’, ‘{3}’, ‘{4}’, ‘{5}’, ‘{6}’, ‘{7}’, ‘{8}’, ‘{9}’, ‘{10}’, ‘{11}’, ‘{12}’, ‘{13}’);”
                    , AnsData00.Strcard_id, AnsData00.Strdoor_id, AnsData00.Strtype, AnsData00.Strblock, AnsData00.Strlevel, AnsData00.Straccess_time_1_start, AnsData00.Straccess_time_1_end, AnsData00.Straccess_time_2_start, AnsData00.Straccess_time_2_end, AnsData00.Straccess_time_3_start, AnsData00.Straccess_time_3_end, AnsData00.Strweek_plan, AnsData00.Stravailable_date_start, AnsData00.Stravailable_date_end);
                    MySQL.InsertUpdateDelete(SQL);
                }
            }
            //————————
            *
            */

        }//for (int j = 0; j < m_ALDoor.Count; j++)
    }//for (int i = 0; i < m_ALCard.Count; i++)
}//public void calculate_saveDB()

//—
//建立傳送授權參數函數
public static void sendData2HW()//20180606
{
    //—
    //製作授權等待動畫
    m_intAuthorizationStep = 2;
    m_dblAuthorizationNow = 0;
    //—製作授權等待動畫

    bool blnloop = false;
    String SQL = “”;
    String Strcard_id = “”;
    //–
    //sendData2HW()中增加抓取卡片內碼+卡片display+卡片pin_code+卡片效期+卡片APB
    String Strcard_code = “”;
    String Strcard_display = “”;
    String Strcard_pin_code = “”;
    String Strcard_valid_start = “”;
    String Strcard_valid_endle = “”;
    String Strcard_apb_level_value = “”;
    String Strcard_apb_apb_enabled = “”;

    //–
    String Strdoor_id = “”;

    String Strcontroller_model = “”;//控制器型態
    String Strcontroller_sn = “”;
    String Strcontroller_IP = “”;
    String Strcontroller_Port = “”;//增加sendData2HW()中controller_Port的抓取-呼叫Getsy_dm_Controller_id需要使用
    String Strconnetction_mode = “”;//控制器連線模式
    //—
    //新增一個ArrayList紀錄CONTROLLER的SYDM ID
    String Strsydm_id = “”;
    ArrayList AL_sydm_id = new ArrayList();
    AL_sydm_id.Clear();
    //—新增一個ArrayList紀錄CONTROLLER的SYDM ID

    ArrayList AL_AllDoorid = new ArrayList();//記錄同控制器下的門ID
    ArrayList AL_AnsData = new ArrayList();//存放所有授權資料

    bool blnDeleteCard = true;
    ControllerAuthorization SendAnsData = new ControllerAuthorization();//實際傳送變數值
    SendAnsData.authorizations.Clear();
    Authorization AnsAuthorization = new Authorization();//實際傳送變數值
    ControllerDelAuthorization DelSendAnsData = new ControllerDelAuthorization();//實際傳送變數值
    DelSendAnsData.authorizations.Clear();
    DelAuthorization DelAuthorization = new DelAuthorization();//實際傳送變數值

    //—
    //把相同SYDM的授權命令集合一次傳送 ~ 查詢系統目前所有SYDM
    ArrayList AL_sydmAll = new ArrayList();
    AL_sydmAll.Clear();
    MySqlDataReader ReaderSydmAll = MySQL.GetDataReader(“SELECT id,identifier FROM sydm;”);
    while (ReaderSydmAll.Read())
    {
        AL_sydmAll.Add(ReaderSydmAll[“id”].ToString() + “,” + ReaderSydmAll[“identifier”].ToString());//DB用id關聯,API用identifier操作
    }
    ReaderSydmAll.Close();
    //—把相同SYDM的授權命令集合一次傳送 ~ 查詢系統目前所有SYDM

    //—
    //修改授權時呼叫SYDM_GET_CONTROLLER_CONNECTION API位置,為了減少呼叫該API次數
    //—
    //SYDM和SYCG API呼叫並存實現
    if (!Main_Frm.pForm1.m_changeSYCGMode)//SYDM
    {
        Main_Frm.pForm1.m_blnAPI = HW_Net_API.getController_Connection();
    }
    else//SYCG
    {
        Main_Frm.pForm1.m_blnAPI = HW_Net_API.SYCG_getSYDMList();
        if (Main_Frm.pForm1.m_blnAPI)
        {
            HW_Net_API.m_Controller_Connection.controllers.Clear();
            for (int l = 0; l < Main_Frm.m_Sydms.sydms.Count; l++)
            {
                HW_Net_API.SYCG_callSYDMCommand(“SYDM_GET_CONTROLLER_CONNECTION”, “”, Main_Frm.m_Sydms.sydms[l].identifier.ToString());
            }
        }
    }
    //—SYDM和SYCG API呼叫並存實現
    //—修改授權時呼叫SYDM_GET_CONTROLLER_CONNECTION API位置,為了減少呼叫該API次數

    //—
    //授權呼叫SQL的維度降低-把card、door和控制器查詢的動作存放在記憶體中,當要再查時先找記憶體

    bool blnDoorId2ControllerVarsCheck = false;
    String[] StrDoorId2ControllerVars = null;
    ArrayList AL_DoorId2ControllerVarsAll = new ArrayList();

    bool blnControllerSN2DoorIdsCheck = false;
    String[] StrControllerSN2DoorIds = null;
    ArrayList AL_ControllerSN2DoorIdsAll = new ArrayList();

    bool blncontroller_door_indexCheck = false;
    String[] Strcontroller_door_index = null;
    ArrayList AL_controller_door_index = new ArrayList();

    int index = 0;

    AL_DoorId2ControllerVarsAll.Clear();
    AL_ControllerSN2DoorIdsAll.Clear();
    AL_controller_door_index.Clear();
    //—授權呼叫SQL的維度降低-把card、door和控制器查詢的動作存放在記憶體中,當要再查時先找記憶體

    //判斷是否還有未傳送的授權資料    ~   SELECT * FROM  authorization_data WHERE state <> 0;
    //找出 第一筆狀態>0 的資料,並找出對應控制器
    //—
    //實作傳送授權參數函數-10%
    SQL = “SELECT ad.card_id AS card_id,ad.door_id AS door_id,c.card_code AS card_code,c.display AS display,c.pin AS pin,c.apb_level_value AS apb_level_value FROM authorization_data AS ad,card AS c WHERE (ad.state=1 OR ad.state=-1) AND (ad.card_id=c.id) LIMIT 0,1;”;//授權呼叫SQL的維度降低-把所有單一SELECT語法加上LIMIT 0,1 //修改sendData2HW()中搜尋還未派送的授權資料-SQL = String.Format(“SELECT * FROM  authorization_data WHERE state <> ‘{0}’;”, 0);
    FileLib.logFile(“HW_SQL_track.log”, SQL + “-1&2-” + DateTime.Now.ToString(“HHmmss”));//增加HW_SQL_track.log功能,為了簡化SQL查詢做準備
    MySqlDataReader Reader_Data = MySQL.GetDataReader(SQL);
    if (Reader_Data.HasRows == true)
    {
        blnloop = Reader_Data.HasRows;
        Reader_Data.Read();
        Strcard_id = Reader_Data[“card_id”].ToString();
        Strdoor_id = Reader_Data[“door_id”].ToString();
        Strcard_code = Reader_Data[“card_code”].ToString();
        Strcard_display = Reader_Data[“display”].ToString();
        Strcard_pin_code = Reader_Data[“pin”].ToString();
        Strcard_apb_level_value = Reader_Data[“apb_level_value”].ToString();
        Strcard_valid_start = “”;
        Strcard_valid_endle = “”;
        Strcard_apb_apb_enabled = “”;
        Reader_Data.Close();
        Reader_Data = null;
    }
    else
    {
        Reader_Data.Close();
        Reader_Data = null;
        return;//沒有資料要傳送,直接離開
    }
    //—

    do
    {
        //紀錄對應控制器門數 和 型態    ~   SELECT c.model AS model,c.sn AS sn,ce.connetction_address AS IP,ce.connetction_mode AS connetction_mode FROM door AS d,controller AS c,controller_extend AS ce WHERE (c.sn=ce.controller_sn) AND (c.sn=d.controller_id) AND (d.id='{0}’); Strdoor_id
        //—
        //實作傳送授權參數函數-20%

        //—
        //授權呼叫SQL的維度降低-把card、door和控制器查詢的動作存放在記憶體中,當要再查時先找記憶體
        blnDoorId2ControllerVarsCheck = false;
        StrDoorId2ControllerVars = null;
        for (index = 0; index < AL_DoorId2ControllerVarsAll.Count; index++)
        {
            StrDoorId2ControllerVars = AL_DoorId2ControllerVarsAll[index].ToString().Split(‘,’);
            if (Strdoor_id == StrDoorId2ControllerVars[0])
            {
                blnDoorId2ControllerVarsCheck = true;
                break;
            }
        }

        if (!blnDoorId2ControllerVarsCheck)
        {
            SQL = String.Format(“SELECT c.sydm_id AS sydm_id,c.model AS model,c.sn AS sn,ce.port AS port,ce.connetction_address AS IP,ce.connetction_mode AS connetction_mode FROM door AS d,controller AS c,controller_extend AS ce WHERE (c.sn=ce.controller_sn) AND (c.sn=d.controller_id) AND (d.id='{0}’) LIMIT 0,1;”, Strdoor_id);//授權呼叫SQL的維度降低-把所有單一SELECT語法加上LIMIT 0,1 //增加sendData2HW()中controller_Port的抓取-呼叫Getsy_dm_Controller_id需要使用 ~ SQL = String.Format(“SELECT c.model AS model,c.sn AS sn,ce.connetction_address AS IP,ce.connetction_mode AS connetction_mode FROM door AS d,controller AS c,controller_extend AS ce WHERE (c.sn=ce.controller_sn) AND (c.sn=d.controller_id) AND (d.id='{0}’);”, Strdoor_id);
            FileLib.logFile(“HW_SQL_track.log”, SQL + “-3-” + DateTime.Now.ToString(“HHmmss”));//增加HW_SQL_track.log功能,為了簡化SQL查詢做準備
            Reader_Data = MySQL.GetDataReader(SQL);
            while (Reader_Data.Read())
            {
                Strcontroller_model = Reader_Data[“model”].ToString(); ;//控制器型態
                Strcontroller_sn = Reader_Data[“sn”].ToString(); ;
                Strcontroller_IP = Reader_Data[“IP”].ToString(); ;
                Strcontroller_Port = Reader_Data[“port”].ToString();//增加sendData2HW()中controller_Port的抓取-呼叫Getsy_dm_Controller_id需要使用
                Strconnetction_mode = Reader_Data[“connetction_mode”].ToString();//控制器連線模式

                //—
                //新增一個ArrayList紀錄CONTROLLER的SYDM ID
                Strsydm_id = Reader_Data[“sydm_id”].ToString();
                AL_sydm_id.Add(Strsydm_id);
                //—新增一個ArrayList紀錄CONTROLLER的SYDM ID

                AL_DoorId2ControllerVarsAll.Add(Strdoor_id + “,” + Strcontroller_model + “,” + Strcontroller_sn + “,” + Strcontroller_IP + “,” + Strcontroller_Port + “,” + Strconnetction_mode + “,” + Strsydm_id);
                break;
            }
            Reader_Data.Close();
            Reader_Data = null;
        }
        else
        {
            Strcontroller_model = StrDoorId2ControllerVars[1]; ;//控制器型態
            Strcontroller_sn = StrDoorId2ControllerVars[2];
            Strcontroller_IP = StrDoorId2ControllerVars[3];
            Strcontroller_Port = StrDoorId2ControllerVars[4];//增加sendData2HW()中controller_Port的抓取-呼叫Getsy_dm_Controller_id需要使用
            Strconnetction_mode = StrDoorId2ControllerVars[5];//控制器連線模式

            //—
            //新增一個ArrayList紀錄CONTROLLER的SYDM ID
            Strsydm_id = StrDoorId2ControllerVars[6];
            AL_sydm_id.Add(Strsydm_id);
        }
        //—授權呼叫SQL的維度降低-把card、door和控制器查詢的動作存放在記憶體中,當要再查時先找記憶體
        //—

        //找出該控制器下所有門且同一張卡的全部授權資料記錄在ArrayList中
        //  AL_AllDoorid    ~   SELECT id FROM door WHERE controller_id='{0}’; Strcontroller_sn
        //  AL_AnsData      ~   SELECT * FROM  authorization_data WHERE (card_id='{0}’) AND (door_id='{1}’); Strcard_id AL_AllDoorid
        //—
        //實作傳送授權參數函數-30%
        AL_AllDoorid.Clear();
        //—
        //授權呼叫SQL的維度降低-把card、door和控制器查詢的動作存放在記憶體中,當要再查時先找記憶體
        blnControllerSN2DoorIdsCheck = false;
        StrControllerSN2DoorIds = null;
        String StrAllDooridBuf = “”;
        for (index = 0; index < AL_ControllerSN2DoorIdsAll.Count; index++)
        {
            StrControllerSN2DoorIds = AL_ControllerSN2DoorIdsAll[index].ToString().Split(‘,’);
            if (Strcontroller_sn == StrControllerSN2DoorIds[0])
            {
                blnControllerSN2DoorIdsCheck = true;
                break;
            }
        }

        if (!blnControllerSN2DoorIdsCheck)
        {
            SQL = String.Format(“SELECT id FROM door WHERE controller_id='{0}’;”, Strcontroller_sn);
            FileLib.logFile(“HW_SQL_track.log”, SQL + “-4-” + DateTime.Now.ToString(“HHmmss”));//增加HW_SQL_track.log功能,為了簡化SQL查詢做準備
            Reader_Data = MySQL.GetDataReader(SQL);
            while (Reader_Data.Read())
            {
                AL_AllDoorid.Add(Reader_Data[“id”].ToString());
            }
            Reader_Data.Close();
            Reader_Data = null;

            StrAllDooridBuf = Strcontroller_sn;
            for (index = 0; index < AL_AllDoorid.Count; index++)
            {
                StrAllDooridBuf += “,” + AL_AllDoorid[index].ToString();
            }
            AL_ControllerSN2DoorIdsAll.Add(StrAllDooridBuf);
        }
        else
        {
            for (index = 1; index < StrControllerSN2DoorIds.Length; index++)
            {
                AL_AllDoorid.Add(StrControllerSN2DoorIds[index]);
            }
        }
        //—授權呼叫SQL的維度降低-把card、door和控制器查詢的動作存放在記憶體中,當要再查時先找記憶體

        AL_AnsData.Clear();

        StrAllDooridBuf = “”;
        for (int i = 0; i < AL_AllDoorid.Count; i++)
        {
            if (i < (AL_AllDoorid.Count – 1))
            {
                StrAllDooridBuf += AL_AllDoorid[i].ToString() + “,”;
            }
            else
            {
                StrAllDooridBuf += AL_AllDoorid[i].ToString();
            }
        }
        StrAllDooridBuf = “(” + StrAllDooridBuf + “)”;

        SQL = String.Format(“SELECT * FROM  authorization_data WHERE (card_id='{0}’) AND (door_id IN {1});”, Strcard_id, StrAllDooridBuf);//授權呼叫SQL的維度降低-把所有迴圈包覆的SQL全部改成 IN(….)型式
        FileLib.logFile(“HW_SQL_track.log”, SQL + “-5-” + DateTime.Now.ToString(“HHmmss”));//增加HW_SQL_track.log功能,為了簡化SQL查詢做準備
        Reader_Data = MySQL.GetDataReader(SQL);
        while (Reader_Data.Read())
        {

            /*
            CREATE TABLE IF NOT EXISTS `authorization_data` (
              `card_id` int(11) NOT NULL,
              `door_id` int(11) NOT NULL,
              `type` int(11) NOT NULL DEFAULT ‘0’,
              `block` varchar(10) NOT NULL DEFAULT ‘0,0,0’,
              `level` int(11) NOT NULL DEFAULT ‘1’,
              `access_time_1_start` time NOT NULL DEFAULT ’00:00:00′,
              `access_time_1_end` time NOT NULL DEFAULT ’23:59:00′,
              `access_time_2_start` time NOT NULL DEFAULT ’00:00:00′,
              `access_time_2_end` time NOT NULL DEFAULT ’00:00:00′,
              `access_time_3_start` time NOT NULL DEFAULT ’00:00:00′,
              `access_time_3_end` time NOT NULL DEFAULT ’00:00:00′,
              `week_plan` int(11) NOT NULL DEFAULT ‘0’,
              `available_date_start` varchar(25) NOT NULL DEFAULT ‘now’,
              `available_date_end` varchar(25) NOT NULL DEFAULT ‘forever’,
              `state` int(11) NOT NULL DEFAULT ‘0’ COMMENT ‘[-1]->del,[0]->finish,[1]->send’,
              PRIMARY KEY (`card_id`,`door_id`)
            ) ENGINE=MyISAM DEFAULT CHARSET=utf8;                          
            */
            AnsData AnsData00 = new AnsData();
            AnsData00.Strcard_id = Reader_Data[“card_id”].ToString();
            AnsData00.Strdoor_id = Reader_Data[“door_id”].ToString();
            AnsData00.Strtype = Reader_Data[“type”].ToString();
            AnsData00.Strblock = Reader_Data[“block”].ToString();
            AnsData00.Strlevel = Reader_Data[“level”].ToString();
            AnsData00.Straccess_time_1_start = Reader_Data[“access_time_1_start”].ToString();
            AnsData00.Straccess_time_1_end = Reader_Data[“access_time_1_end”].ToString();
            AnsData00.Straccess_time_2_start = Reader_Data[“access_time_2_start”].ToString();
            AnsData00.Straccess_time_2_end = Reader_Data[“access_time_2_end”].ToString();
            AnsData00.Straccess_time_3_start = Reader_Data[“access_time_3_start”].ToString();
            AnsData00.Straccess_time_3_end = Reader_Data[“access_time_3_end”].ToString();
            AnsData00.Strweek_plan = Reader_Data[“week_plan”].ToString();
            AnsData00.Stravailable_date_start = Reader_Data[“available_date_start”].ToString();
            AnsData00.Stravailable_date_end = Reader_Data[“available_date_end”].ToString();
            AnsData00.state = Convert.ToInt32(Reader_Data[“state”].ToString());//加刪旗標(-1,0,1)刪,預設,加
            AnsData00.flag = 0;
            AL_AnsData.Add(AnsData00);

        }//while (Reader_Data.Read())
        Reader_Data.Close();
        Reader_Data = null;

        //—

        //按照控制器型態和門數 組合(state>0)出正確的傳送參數 並傳送
        //SELECT controller_door_index FROM door WHERE id='{0}’; 
        //—
        //實作傳送授權參數函數-40%
        int[] doorstate = null;//紀錄同一控制器開門狀態
        //–
        //sendData2HW()中增加計算那些門或那些樓層可通行的flag
        int door_accessable_flags = 0;
        int[] floor_flags_list = new int[16];
        for (int l = 0; l < floor_flags_list.Length; l++)
        {
            floor_flags_list[l] = 0;
        }
        //–

        AuthorizedConfigurationList[] AnsAuthorizedConfigurationList = null;//sendData2HW()中增加門參整合用變數

        switch (Convert.ToInt32(Strcontroller_model))
        {
            case 1://單門模式
                doorstate = new int[1];
                //–
                //sendData2HW()中增加門參整合用變數
                AnsAuthorizedConfigurationList = new AuthorizedConfigurationList[1];
                AnsAuthorizedConfigurationList[0] = new AuthorizedConfigurationList();
                //–
                break;
            case 2://4門模式
                doorstate = new int[4];
                //–
                //sendData2HW()中增加門參整合用變數
                AnsAuthorizedConfigurationList = new AuthorizedConfigurationList[4];
                for (int l = 0; l < 4; l++)
                {
                    AnsAuthorizedConfigurationList[l] = new AuthorizedConfigurationList();
                }
                //–
                break;
            case 3://4門強制配對模式
                doorstate = new int[4];
                //–
                //sendData2HW()中增加門參整合用變數
                AnsAuthorizedConfigurationList = new AuthorizedConfigurationList[4];
                for (int l = 0; l < 4; l++)
                {
                    AnsAuthorizedConfigurationList[l] = new AuthorizedConfigurationList();
                }
                //–
                break;
            case 4://12門模式
                doorstate = new int[12];
                //–
                //sendData2HW()中增加門參整合用變數
                AnsAuthorizedConfigurationList = new AuthorizedConfigurationList[1];
                AnsAuthorizedConfigurationList[0] = new AuthorizedConfigurationList();
                //–
                break;
            case 5://電梯/儲物櫃模式
                doorstate = new int[128];
                //–
                //sendData2HW()中增加門參整合用變數
                AnsAuthorizedConfigurationList = new AuthorizedConfigurationList[1];
                AnsAuthorizedConfigurationList[0] = new AuthorizedConfigurationList();
                //–
                break;
        }
        for (int i = 0; i < doorstate.Length; i++)
        {
            doorstate[i] = 0;
        }

        CalculatePassTime buf_CalculatePassTime = new CalculatePassTime();//把資料從『門(N個)VS卡』-> 『控(1個)VS卡』,合併通行時段變數
        for (int i = 0; i < AL_AnsData.Count; i++)
        {
            Strcard_valid_start = ((AnsData)AL_AnsData[i]).Stravailable_date_start;
            Strcard_valid_endle = ((AnsData)AL_AnsData[i]).Stravailable_date_end;

            int controller_door_index = 0;

            //—
            //授權呼叫SQL的維度降低-把card、door和控制器查詢的動作存放在記憶體中,當要再查時先找記憶體
            blncontroller_door_indexCheck = false;
            Strcontroller_door_index = null;
            for (index = 0; index < AL_controller_door_index.Count; index++)
            {
                Strcontroller_door_index = AL_controller_door_index[index].ToString().Split(‘,’);
                if (Strdoor_id == Strcontroller_door_index[0])
                {
                    blncontroller_door_indexCheck = true;
                    break;
                }
            }

            if (!blncontroller_door_indexCheck)
            {
                SQL = String.Format(“SELECT controller_door_index FROM door WHERE id='{0}’ LIMIT 0,1;”, ((AnsData)AL_AnsData[i]).Strdoor_id);//授權呼叫SQL的維度降低-把所有單一SELECT語法加上LIMIT 0,1
                FileLib.logFile(“HW_SQL_track.log”, SQL + “-6-” + DateTime.Now.ToString(“HHmmss”));//增加HW_SQL_track.log功能,為了簡化SQL查詢做準備
                Reader_Data = MySQL.GetDataReader(SQL);
                while (Reader_Data.Read())
                {
                    controller_door_index = Convert.ToInt32(Reader_Data[“controller_door_index”].ToString());
                    break;
                }
                Reader_Data.Close();
                Reader_Data = null;

                AL_controller_door_index.Add(Strdoor_id + “,” + controller_door_index);
            }
            else
            {
                controller_door_index = Convert.ToInt32(Strcontroller_door_index[1]);
            }
            //授權呼叫SQL的維度降低-把card、door和控制器查詢的動作存放在記憶體中,當要再查時先找記憶體

            if (((AnsData)AL_AnsData[i]).state >= 0)
            {
                doorstate[controller_door_index – 1] = 1;//該控制器的第 controller_door_index 門可通行

                //–
                //sendData2HW()中增加計算那些門或那些樓層可通行的flag
                if (Convert.ToInt32(Strcontroller_model) != 5)//非電梯
                {
                    door_accessable_flags += (int)Math.Pow(2, (controller_door_index – 1));
                }
                else//電梯
                {
                    /*
                    128 064 032 016 008 004 002 001
                    ——————————-
                    7   6   5   4   3   2   1   0
                    15  14  13  12  11  10  9   8
                    23  22  21  20  19  18  17  16
                            
                    X=6,13 –> X=(controller_door_index – 1)
                    X<8*(l+1) –>l 就是組別
                    2^{8-[8*(l+1) – X]} –> value
                    */
                    int l = 1;
                    do
                    {
                        if ((l * 8) > (controller_door_index – 1))
                        {
                            int k = 8 – ((l * 8) – (controller_door_index – 1));
                            floor_flags_list[(l – 1)] += (int)Math.Pow(2, k);
                            break;
                        }
                        l++;
                    } while (l <= 16);
                }
                //–

            }
            else
            {
                doorstate[controller_door_index – 1] = 0;//該控制器的第 controller_door_index 門不可通行
            }

            //–
            //把資料從『門(N個)VS卡』-> 『控(1個)VS卡』
            /*
            單門,12門,電梯 ->合併一份門參
            4門 -> 4份門參
            */
            if ((Convert.ToInt32(Strcontroller_model) == 2) || (Convert.ToInt32(Strcontroller_model) == 3))//4門 -> 4份門參
            {
                string[] strs00 = ((AnsData)AL_AnsData[i]).Strblock.Split(‘,’);
                if (Convert.ToInt32(strs00[2]) == 0)
                {
                    Strcard_apb_apb_enabled = “1”;
                }
                else
                {
                    Strcard_apb_apb_enabled = “0”;
                }
                AnsAuthorizedConfigurationList[controller_door_index – 1].card_disabled = Convert.ToInt32(strs00[0]);
                AnsAuthorizedConfigurationList[controller_door_index – 1].card_in_black = Convert.ToInt32(strs00[1]);
                AnsAuthorizedConfigurationList[controller_door_index – 1].card_level = Convert.ToInt32(((AnsData)AL_AnsData[i]).Strlevel);
                AnsAuthorizedConfigurationList[controller_door_index – 1].card_type = Convert.ToInt32(((AnsData)AL_AnsData[i]).Strtype);

                TimeRangeList bufTimeRangeList01 = new TimeRangeList();
                TimeRangeList bufTimeRangeList02 = new TimeRangeList();
                TimeRangeList bufTimeRangeList03 = new TimeRangeList();
                string[] strs01 = ((AnsData)AL_AnsData[i]).Straccess_time_1_start.Split(‘:’);
                string[] strs02 = ((AnsData)AL_AnsData[i]).Straccess_time_1_end.Split(‘:’);
                bufTimeRangeList01.start_timestamp = Convert.ToInt32(strs01[0]) * 3600 + Convert.ToInt32(strs01[1]) * 60 + Convert.ToInt32(strs01[2]);
                bufTimeRangeList01.endle_timestamp = Convert.ToInt32(strs02[0]) * 3600 + Convert.ToInt32(strs02[1]) * 60 + Convert.ToInt32(strs02[2]);
                AnsAuthorizedConfigurationList[controller_door_index – 1].time_range_list.Add(bufTimeRangeList01);

                string[] strs03 = ((AnsData)AL_AnsData[i]).Straccess_time_2_start.Split(‘:’);
                string[] strs04 = ((AnsData)AL_AnsData[i]).Straccess_time_2_end.Split(‘:’);
                bufTimeRangeList02.start_timestamp = Convert.ToInt32(strs03[0]) * 3600 + Convert.ToInt32(strs03[1]) * 60 + Convert.ToInt32(strs03[2]);
                bufTimeRangeList02.endle_timestamp = Convert.ToInt32(strs04[0]) * 3600 + Convert.ToInt32(strs04[1]) * 60 + Convert.ToInt32(strs04[2]);
                AnsAuthorizedConfigurationList[controller_door_index – 1].time_range_list.Add(bufTimeRangeList02);

                string[] strs05 = ((AnsData)AL_AnsData[i]).Straccess_time_3_start.Split(‘:’);
                string[] strs06 = ((AnsData)AL_AnsData[i]).Straccess_time_3_end.Split(‘:’);
                bufTimeRangeList03.start_timestamp = Convert.ToInt32(strs05[0]) * 3600 + Convert.ToInt32(strs05[1]) * 60 + Convert.ToInt32(strs05[2]);
                bufTimeRangeList03.endle_timestamp = Convert.ToInt32(strs06[0]) * 3600 + Convert.ToInt32(strs06[1]) * 60 + Convert.ToInt32(strs06[2]);
                AnsAuthorizedConfigurationList[controller_door_index – 1].time_range_list.Add(bufTimeRangeList03);

                AnsAuthorizedConfigurationList[controller_door_index – 1].week_plan_flags = Convert.ToInt32(((AnsData)AL_AnsData[i]).Strweek_plan);
            }
            else//單門,12門,電梯 ->合併一份門參
            {
                string[] strs00 = ((AnsData)AL_AnsData[i]).Strblock.Split(‘,’);
                if (Convert.ToInt32(strs00[2]) == 0)
                {
                    Strcard_apb_apb_enabled = “1”;
                }
                else
                {
                    Strcard_apb_apb_enabled = “0”;
                }
                if (AnsAuthorizedConfigurationList[0].card_disabled < Convert.ToInt32(strs00[0]))
                {
                    AnsAuthorizedConfigurationList[0].card_disabled = Convert.ToInt32(strs00[0]);
                }
                if (AnsAuthorizedConfigurationList[0].card_in_black < Convert.ToInt32(strs00[1]))
                {
                    AnsAuthorizedConfigurationList[0].card_in_black = Convert.ToInt32(strs00[1]);
                }

                if (AnsAuthorizedConfigurationList[0].card_level < Convert.ToInt32(((AnsData)AL_AnsData[i]).Strlevel))
                {
                    AnsAuthorizedConfigurationList[0].card_level = Convert.ToInt32(((AnsData)AL_AnsData[i]).Strlevel);
                }

                if (AnsAuthorizedConfigurationList[0].card_type < Convert.ToInt32(((AnsData)AL_AnsData[i]).Strtype))
                {
                    AnsAuthorizedConfigurationList[0].card_type = Convert.ToInt32(((AnsData)AL_AnsData[i]).Strtype);
                }

                if (AnsAuthorizedConfigurationList[0].week_plan_flags < Convert.ToInt32(((AnsData)AL_AnsData[i]).Strweek_plan))
                {
                    AnsAuthorizedConfigurationList[0].week_plan_flags = Convert.ToInt32(((AnsData)AL_AnsData[i]).Strweek_plan);
                }

                AnsAuthorizedConfigurationList[0].time_range_list.Clear();
                buf_CalculatePassTime.SetInput(((AnsData)AL_AnsData[i]).Straccess_time_1_start, ((AnsData)AL_AnsData[i]).Straccess_time_1_end, true);
                buf_CalculatePassTime.SetInput(((AnsData)AL_AnsData[i]).Straccess_time_2_start, ((AnsData)AL_AnsData[i]).Straccess_time_2_end, true);
                buf_CalculatePassTime.SetInput(((AnsData)AL_AnsData[i]).Straccess_time_3_start, ((AnsData)AL_AnsData[i]).Straccess_time_3_end, true);
                TimeRangeList bufTimeRangeList01 = new TimeRangeList();
                TimeRangeList bufTimeRangeList02 = new TimeRangeList();
                TimeRangeList bufTimeRangeList03 = new TimeRangeList();
                int count = buf_CalculatePassTime.CalOutput();
                switch (count)
                {
                    case 1:
                        string[] strs01 = buf_CalculatePassTime.m_StrS1.Split(‘:’);
                        string[] strs02 = buf_CalculatePassTime.m_StrE1.Split(‘:’);
                        string[] strs03 = “00:00”.Split(‘:’);
                        string[] strs04 = “00:00”.Split(‘:’);
                        string[] strs05 = “00:00”.Split(‘:’);
                        string[] strs06 = “00:00”.Split(‘:’);
                        bufTimeRangeList01.start_timestamp = Convert.ToInt32(strs01[0]) * 3600 + Convert.ToInt32(strs01[1]) * 60;
                        bufTimeRangeList01.endle_timestamp = Convert.ToInt32(strs02[0]) * 3600 + Convert.ToInt32(strs02[1]) * 60;
                        AnsAuthorizedConfigurationList[0].time_range_list.Add(bufTimeRangeList01);
                        bufTimeRangeList02.start_timestamp = Convert.ToInt32(strs03[0]) * 3600 + Convert.ToInt32(strs03[1]) * 60;
                        bufTimeRangeList02.endle_timestamp = Convert.ToInt32(strs04[0]) * 3600 + Convert.ToInt32(strs04[1]) * 60;
                        AnsAuthorizedConfigurationList[0].time_range_list.Add(bufTimeRangeList02);
                        bufTimeRangeList03.start_timestamp = Convert.ToInt32(strs05[0]) * 3600 + Convert.ToInt32(strs05[1]) * 60;
                        bufTimeRangeList03.endle_timestamp = Convert.ToInt32(strs06[0]) * 3600 + Convert.ToInt32(strs06[1]) * 60;
                        AnsAuthorizedConfigurationList[0].time_range_list.Add(bufTimeRangeList03);
                        break;
                    case 2:
                        string[] strs07 = buf_CalculatePassTime.m_StrS1.Split(‘:’);
                        string[] strs08 = buf_CalculatePassTime.m_StrE1.Split(‘:’);
                        string[] strs09 = buf_CalculatePassTime.m_StrS2.Split(‘:’);
                        string[] strs10 = buf_CalculatePassTime.m_StrE2.Split(‘:’);
                        string[] strs11 = “00:00”.Split(‘:’);
                        string[] strs12 = “00:00”.Split(‘:’);
                        bufTimeRangeList01.start_timestamp = Convert.ToInt32(strs07[0]) * 3600 + Convert.ToInt32(strs07[1]) * 60;
                        bufTimeRangeList01.endle_timestamp = Convert.ToInt32(strs08[0]) * 3600 + Convert.ToInt32(strs08[1]) * 60;
                        AnsAuthorizedConfigurationList[0].time_range_list.Add(bufTimeRangeList01);
                        bufTimeRangeList02.start_timestamp = Convert.ToInt32(strs09[0]) * 3600 + Convert.ToInt32(strs09[1]) * 60;
                        bufTimeRangeList02.endle_timestamp = Convert.ToInt32(strs10[0]) * 3600 + Convert.ToInt32(strs10[1]) * 60;
                        AnsAuthorizedConfigurationList[0].time_range_list.Add(bufTimeRangeList02);
                        bufTimeRangeList03.start_timestamp = Convert.ToInt32(strs11[0]) * 3600 + Convert.ToInt32(strs11[1]) * 60;
                        bufTimeRangeList03.endle_timestamp = Convert.ToInt32(strs12[0]) * 3600 + Convert.ToInt32(strs12[1]) * 60;
                        AnsAuthorizedConfigurationList[0].time_range_list.Add(bufTimeRangeList03);
                        break;
                    case 3:
                        string[] strs13 = buf_CalculatePassTime.m_StrS1.Split(‘:’);
                        string[] strs14 = buf_CalculatePassTime.m_StrE1.Split(‘:’);
                        string[] strs15 = buf_CalculatePassTime.m_StrS2.Split(‘:’);
                        string[] strs16 = buf_CalculatePassTime.m_StrE2.Split(‘:’);
                        string[] strs17 = buf_CalculatePassTime.m_StrS3.Split(‘:’);
                        string[] strs18 = buf_CalculatePassTime.m_StrE3.Split(‘:’);
                        bufTimeRangeList01.start_timestamp = Convert.ToInt32(strs13[0]) * 3600 + Convert.ToInt32(strs13[1]) * 60;
                        bufTimeRangeList01.endle_timestamp = Convert.ToInt32(strs14[0]) * 3600 + Convert.ToInt32(strs14[1]) * 60;
                        AnsAuthorizedConfigurationList[0].time_range_list.Add(bufTimeRangeList01);
                        bufTimeRangeList02.start_timestamp = Convert.ToInt32(strs15[0]) * 3600 + Convert.ToInt32(strs15[1]) * 60;
                        bufTimeRangeList02.endle_timestamp = Convert.ToInt32(strs16[0]) * 3600 + Convert.ToInt32(strs16[1]) * 60;
                        AnsAuthorizedConfigurationList[0].time_range_list.Add(bufTimeRangeList02);
                        bufTimeRangeList03.start_timestamp = Convert.ToInt32(strs17[0]) * 3600 + Convert.ToInt32(strs17[1]) * 60;
                        bufTimeRangeList03.endle_timestamp = Convert.ToInt32(strs18[0]) * 3600 + Convert.ToInt32(strs18[1]) * 60;
                        AnsAuthorizedConfigurationList[0].time_range_list.Add(bufTimeRangeList03);
                        break;
                    default:
                        string[] strs19 = “00:00”.Split(‘:’);
                        string[] strs20 = “00:00”.Split(‘:’);
                        string[] strs21 = “00:00”.Split(‘:’);
                        string[] strs22 = “00:00”.Split(‘:’);
                        string[] strs23 = “00:00”.Split(‘:’);
                        string[] strs24 = “00:00”.Split(‘:’);
                        bufTimeRangeList01.start_timestamp = Convert.ToInt32(strs19[0]) * 3600 + Convert.ToInt32(strs19[1]) * 60;
                        bufTimeRangeList01.endle_timestamp = Convert.ToInt32(strs20[0]) * 3600 + Convert.ToInt32(strs20[1]) * 60;
                        AnsAuthorizedConfigurationList[0].time_range_list.Add(bufTimeRangeList01);
                        bufTimeRangeList02.start_timestamp = Convert.ToInt32(strs21[0]) * 3600 + Convert.ToInt32(strs21[1]) * 60;
                        bufTimeRangeList02.endle_timestamp = Convert.ToInt32(strs22[0]) * 3600 + Convert.ToInt32(strs22[1]) * 60;
                        AnsAuthorizedConfigurationList[0].time_range_list.Add(bufTimeRangeList02);
                        bufTimeRangeList03.start_timestamp = Convert.ToInt32(strs23[0]) * 3600 + Convert.ToInt32(strs23[1]) * 60;
                        bufTimeRangeList03.endle_timestamp = Convert.ToInt32(strs24[0]) * 3600 + Convert.ToInt32(strs24[1]) * 60;
                        AnsAuthorizedConfigurationList[0].time_range_list.Add(bufTimeRangeList03);
                        break;
                }
            }
            //–

        }//for (int i = 0; i < AL_AnsData.Count; i++)

        //整合傳送參數-SendAnsData
        //整合傳送參數-AnsAuthorization

        //—
        //修改授權時呼叫SYDM_GET_CONTROLLER_CONNECTION API位置,為了減少呼叫該API次數
        /*
        //—
        //SYDM和SYCG API呼叫並存實現
        if (!Main_Frm.pForm1.m_changeSYCGMode)//SYDM
        {
            Main_Frm.pForm1.m_blnAPI = HW_Net_API.getController_Connection();
        }
        else//SYCG
        {
            Main_Frm.pForm1.m_blnAPI = HW_Net_API.SYCG_getSYDMList();
            if (Main_Frm.pForm1.m_blnAPI)
            {
                HW_Net_API.m_Controller_Connection.controllers.Clear();
                for (int l = 0; l < Main_Frm.m_Sydms.sydms.Count; l++)
                {
                    HW_Net_API.SYCG_callSYDMCommand(“SYDM_GET_CONTROLLER_CONNECTION”, “”, Main_Frm.m_Sydms.sydms[l].identifier.ToString());
                }
            }
        }
        //—SYDM和SYCG API呼叫並存實現
        */
        //—修改授權時呼叫SYDM_GET_CONTROLLER_CONNECTION API位置,為了減少呼叫該API次數

        //–
        //AnsAuthorization指定SYDM控制器ID-呼叫Getsy_dm_Controller_id
        AnsAuthorization.identifier = Main_Frm.pForm1.Getsy_dm_Controller_id(Strconnetction_mode, Strcontroller_IP, Strcontroller_Port);
        //–

        //–
        //AnsAuthorization指定指定卡號-sendData2HW()中增加抓取卡片內碼
        AnsAuthorization.card_unique_identifier = Strcard_code;
        //–

        //–
        //AnsAuthorization指定APB參數
        AnsAuthorization.apb_enabled = Convert.ToInt32(Strcard_apb_apb_enabled);
        AnsAuthorization.apb_level_value = Convert.ToInt32(Strcard_apb_level_value);
        //–

        //–
        //AnsAuthorization指定display_text參數
        AnsAuthorization.display_text = Strcard_display;
        //–

        //–
        //AnsAuthorization指定pin_code參數
        AnsAuthorization.pin_code = Strcard_pin_code;
        //–

        //–
        //AnsAuthorization指定valid_start_timestamp+valid_endle_timestamp參數
        DateTime dt0 = new DateTime(2000, 1, 1, 0, 0, 0);
        DateTime dt1;
        DateTime dt2;
        try
        {
            dt1 = Convert.ToDateTime(Strcard_valid_start);
        }
        catch
        {
            dt1 = new DateTime(2000, 1, 1, 0, 0, 0);//卡片時間匯入未填在授權運算時自動轉換成2000/01/01和2068/01/01
        }
        try
        {
            dt2 = Convert.ToDateTime(Strcard_valid_endle);
        }
        catch
        {
            dt2 = new DateTime(2068, 1, 1, 0, 0, 0);//卡片時間匯入未填在授權運算時自動轉換成2000/01/01和2068/01/01
        }
        TimeSpan ts01 = dt1 – dt0;
        TimeSpan ts02 = dt2 – dt0;
        AnsAuthorization.valid_start_timestamp = (Int64)ts01.TotalSeconds;
        AnsAuthorization.valid_endle_timestamp = (Int64)ts02.TotalSeconds;
        //–

        //–
        //sendData2HW()中增加計算那些門或那些樓層可通行的flag
        AnsAuthorization.door_accessable_flags = door_accessable_flags;
        for (int l = 0; l < floor_flags_list.Length; l++)
        {
            AnsAuthorization.floor_flags_list.Add(floor_flags_list[l]);
        }
        //–

        //–
        //把資料從『門(N個)VS卡』-> 『控(1個)VS卡』
        for (int l = 0; l < AnsAuthorizedConfigurationList.Length; l++)
        {
            AnsAuthorization.authorized_configuration_list.Add(AnsAuthorizedConfigurationList[l]);
        }
        //–

        for (int i = 0; i < doorstate.Length; i++)
        {
            if (doorstate[i] != 0)
            {
                blnDeleteCard = false;
                break;
            }
        }

        if (blnDeleteCard == true)
        {
            //執行刪卡
            DelAuthorization.identifier = AnsAuthorization.identifier;
            DelAuthorization.card_unique_identifier = AnsAuthorization.card_unique_identifier;
            DelSendAnsData.authorizations.Add(DelAuthorization);

            DelAuthorization = null;
            DelAuthorization = new DelAuthorization();

        }
        else
        {
            //執行傳卡
            SendAnsData.authorizations.Add(AnsAuthorization);

            AnsAuthorization = null;
            AnsAuthorization = new Authorization();
        }
        //—

        //修改對應已傳送的授權資料
        //直接刪除state=-1的授權資料
        //複寫同卡ID和門ID的授權資料
        //—
        //實作傳送授權參數函數-50%
        SQL = “”;
        for (int i = 0; i < AL_AnsData.Count; i++)
        {
            if (((AnsData)AL_AnsData[i]).state <= 0)
            {
                //SQL = String.Format(“DELETE FROM authorization_data WHERE (card_id='{0}’) AND (door_id='{1}’);”, ((AnsData)AL_AnsData[i]).Strcard_id, ((AnsData)AL_AnsData[i]).Strdoor_id);
                SQL += String.Format(“UPDATE authorization_data SET state = ‘-100′ WHERE (card_id='{0}’) AND (door_id='{1}’);”, ((AnsData)AL_AnsData[i]).Strcard_id, ((AnsData)AL_AnsData[i]).Strdoor_id);//授權呼叫SQL的維度降低-把所有迴圈包覆的SQL全部改成 IN(….)型式 //修正DB派送授權的紀錄狀態語法讓DB支援派送失敗也可復原狀態值
            }
            else
            {
                //SQL = String.Format(“UPDATE authorization_data SET state = ‘0’ WHERE (card_id='{0}’) AND (door_id='{1}’);”, ((AnsData)AL_AnsData[i]).Strcard_id, ((AnsData)AL_AnsData[i]).Strdoor_id);
                SQL += String.Format(“UPDATE authorization_data SET state = ‘100’ WHERE (card_id='{0}’) AND (door_id='{1}’);”, ((AnsData)AL_AnsData[i]).Strcard_id, ((AnsData)AL_AnsData[i]).Strdoor_id);//授權呼叫SQL的維度降低-把所有迴圈包覆的SQL全部改成 IN(….)型式 //修正DB派送授權的紀錄狀態語法讓DB支援派送失敗也可復原狀態值
            }
            m_dblAuthorizationNow++;
        }
        FileLib.logFile(“HW_SQL_track.log”, SQL + “-9-” + DateTime.Now.ToString(“HHmmss”));//增加HW_SQL_track.log功能,為了簡化SQL查詢做準備
        MySQL.InsertUpdateDelete(SQL);
        //—

        //判斷是否還有未傳送的授權資料    ~   SELECT * FROM  `authorization_data` WHERE state <> 0;
        //找出 第一筆狀態>0 的資料,並找出對應控制器
        //—
        //實作傳送授權參數函數-10%
        SQL = “SELECT ad.card_id AS card_id,ad.door_id AS door_id,c.card_code AS card_code,c.display AS display,c.pin AS pin,c.apb_level_value AS apb_level_value FROM authorization_data AS ad,card AS c WHERE (ad.state=1 OR ad.state=-1) AND (ad.card_id=c.id) LIMIT 0,1;”;//授權呼叫SQL的維度降低-把所有單一SELECT語法加上LIMIT 0,1 //SQL = String.Format(“SELECT * FROM  authorization_data WHERE state <> ‘{0}’;”, 0);
        FileLib.logFile(“HW_SQL_track.log”, SQL + “-7&8-” + DateTime.Now.ToString(“HHmmss”));//增加HW_SQL_track.log功能,為了簡化SQL查詢做準備
        Reader_Data = MySQL.GetDataReader(SQL);
        if (Reader_Data.HasRows == true)
        {
            blnloop = Reader_Data.HasRows;
            Reader_Data.Read();
            Strcard_id = Reader_Data[“card_id”].ToString();
            Strdoor_id = Reader_Data[“door_id”].ToString();
            Strcard_code = Reader_Data[“card_code”].ToString();
            Strcard_display = Reader_Data[“display”].ToString();
            Strcard_pin_code = Reader_Data[“pin”].ToString();
            Strcard_apb_level_value = Reader_Data[“apb_level_value”].ToString();
            Strcard_valid_start = “”;
            Strcard_valid_endle = “”;
            Strcard_apb_apb_enabled = “”;
            Reader_Data.Close();
            Reader_Data = null;
        }
        else
        {
            Reader_Data.Close();
            Reader_Data = null;
            blnloop = false;//沒有資料要傳送,直接離開
        }
        //—

    } while (blnloop);

    //—
    //製作授權等待動畫
    m_intAuthorizationStep = 3;
    m_dblAuthorizationNow = 0;
    //—製作授權等待動畫

    String StrAns = “”;
    String StrTxtData = “”;//修正傳送授權內容到紀錄文字檔符合SYDM/SYCG兩種模式
    bool blncheck = false;
    if (blnDeleteCard == true)
    {
        //執行刪卡
        //—
        //SYDM和SYCG API呼叫並存實現
        if (!Main_Frm.pForm1.m_changeSYCGMode)//SYDM
        {
            StrAns = parseJSON.composeJSONCControllerDelAuthorization(DelSendAnsData);
            blncheck = HW_Net_API.delControllerAuthorization(StrAns);//SYDM控制器授權API呼叫
            StrTxtData = StrAns;//修正傳送授權內容到紀錄文字檔符合SYDM/SYCG兩種模式
            if (!blncheck)
            {
                StrTxtData = StrTxtData + “-ERROR\n”;//原本設計如果傳送授權失敗不記錄傳送內容,現在要改成都要記錄下來授權的JSON,錯誤的在後面加上-ERROR
            }
        }
        else//SYCG
        {
            ControllerDelAuthorization SYCG_DelSendAnsData = new ControllerDelAuthorization();//實際傳送變數值
            //—
            //把相同SYDM的授權命令集合一次傳送 ~ 依照SYDM進行授權資料分類+實際傳送 
            /*
            for (int l = 0; l < DelSendAnsData.authorizations.Count; l++)
            {
                SYCG_DelSendAnsData.authorizations.Clear();
                SYCG_DelSendAnsData.authorizations.Add(DelSendAnsData.authorizations[l]);
                StrAns = parseJSON.composeJSONCControllerDelAuthorization(SYCG_DelSendAnsData);
                blncheck = HW_Net_API.SYCG_callSYDMCommand(“SYDM_DELETE_CONTROLLER_AUTHORIZATION”, StrAns, (String)AL_sydm_id[l]);
                if (!blncheck)
                {
                    StrTxtData = StrTxtData + StrAns + “-ERROR\n”;//原本設計如果傳送授權失敗不記錄傳送內容,現在要改成都要記錄下來授權的JSON,錯誤的在後面加上-ERROR
                    //授權時改成就算有錯也要每一筆都傳- break;
                }
                else
                {
                    StrTxtData = StrTxtData + StrAns + “\n”;//修正傳送授權內容到紀錄文字檔符合SYDM/SYCG兩種模式
                }
            }//for (int l = 0; l < DelSendAnsData.authorizations.Count; l++)
            */
            for (int l = 0; l < AL_sydmAll.Count; l++)
            {
                String[] Strchecksydm = AL_sydmAll[l].ToString().Split(‘,’);
                SYCG_DelSendAnsData.authorizations.Clear();
                for (int m = 0; m < DelSendAnsData.authorizations.Count; m++)
                {
                    if (Strchecksydm[0] == (String)AL_sydm_id[m])
                    {
                        SYCG_DelSendAnsData.authorizations.Add(DelSendAnsData.authorizations[m]);
                    }
                }//for (int m = 0; m < DelSendAnsData.authorizations.Count; m++)
                if (SYCG_DelSendAnsData.authorizations.Count > 0)
                {
                    StrAns = parseJSON.composeJSONCControllerDelAuthorization(SYCG_DelSendAnsData);
                    blncheck = HW_Net_API.SYCG_callSYDMCommand(“SYDM_DELETE_CONTROLLER_AUTHORIZATION”, StrAns, Strchecksydm[1]);
                    if (!blncheck)
                    {
                        StrTxtData = StrTxtData + StrAns + “-ERROR\n”;//原本設計如果傳送授權失敗不記錄傳送內容,現在要改成都要記錄下來授權的JSON,錯誤的在後面加上-ERROR
                        //授權時改成就算有錯也要每一筆都傳- break;
                    }
                    else
                    {
                        StrTxtData = StrTxtData + StrAns + “\n”;//修正傳送授權內容到紀錄文字檔符合SYDM/SYCG兩種模式
                    }
                }//if (SYCG_DelSendAnsData.authorizations.Count > 0)
            }//for (int l = 0; l < AL_sydmAll.Count; l++)
            //—把相同SYDM的授權命令集合一次傳送 ~ 依照SYDM進行授權資料分類+實際傳送 
        }
        //—SYDM和SYCG API呼叫並存實現

    }
    else
    {
        //執行傳卡
        //—
        //SYDM和SYCG API呼叫並存實現
        if (!Main_Frm.pForm1.m_changeSYCGMode)//SYDM
        {
            StrAns = parseJSON.composeJSONControllerAuthorization(SendAnsData);
            blncheck = HW_Net_API.addControllerAuthorization(StrAns);//SYDM控制器授權API呼叫
            StrTxtData = StrAns;//修正傳送授權內容到紀錄文字檔符合SYDM/SYCG兩種模式
            if (!blncheck)
            {
                StrTxtData = StrTxtData + “-ERROR\n”;//原本設計如果傳送授權失敗不記錄傳送內容,現在要改成都要記錄下來授權的JSON,錯誤的在後面加上-ERROR
            }
        }
        else//SYCG
        {
            ControllerAuthorization SYCG_SendAnsData = new ControllerAuthorization();//實際傳送變數值
            //—
            //把相同SYDM的授權命令集合一次傳送 ~ 依照SYDM進行授權資料分類+實際傳送 
            /*
            for (int l = 0; l < SendAnsData.authorizations.Count; l++)
            {
                SYCG_SendAnsData.authorizations.Clear();
                SYCG_SendAnsData.authorizations.Add(SendAnsData.authorizations[l]);
                StrAns = parseJSON.composeJSONControllerAuthorization(SYCG_SendAnsData);
                blncheck = HW_Net_API.SYCG_callSYDMCommand(“SYDM_ADD_CONTROLLER_AUTHORIZATION”, StrAns, (String)AL_sydm_id[l]);
                if (!blncheck)
                {
                    StrTxtData = StrTxtData + StrAns + “-ERROR\n”;//原本設計如果傳送授權失敗不記錄傳送內容,現在要改成都要記錄下來授權的JSON,錯誤的在後面加上-ERROR
                    //授權時改成就算有錯也要每一筆都傳- break;
                }
                else
                {
                    StrTxtData = StrTxtData + StrAns + “\n”;//修正傳送授權內容到紀錄文字檔符合SYDM/SYCG兩種模式
                }
            }//for (int l = 0; l < SendAnsData.authorizations.Count; l++)
            */
            for (int l = 0; l < AL_sydmAll.Count; l++)
            {
                String[] Strchecksydm = AL_sydmAll[l].ToString().Split(‘,’);
                SYCG_SendAnsData.authorizations.Clear();
                for (int m = 0; m < SendAnsData.authorizations.Count; m++)
                {
                    if (Strchecksydm[0] == (String)AL_sydm_id[m])
                    {
                        SYCG_SendAnsData.authorizations.Add(SendAnsData.authorizations[m]);
                    }
                }//for (int m = 0; m < SendAnsData.authorizations.Count; m++)
                if (SYCG_SendAnsData.authorizations.Count > 0)
                {
                    StrAns = parseJSON.composeJSONControllerAuthorization(SYCG_SendAnsData);
                    blncheck = HW_Net_API.SYCG_callSYDMCommand(“SYDM_ADD_CONTROLLER_AUTHORIZATION”, StrAns, Strchecksydm[1]);
                    if (!blncheck)
                    {
                        StrTxtData = StrTxtData + StrAns + “-ERROR\n”;//原本設計如果傳送授權失敗不記錄傳送內容,現在要改成都要記錄下來授權的JSON,錯誤的在後面加上-ERROR
                        //授權時改成就算有錯也要每一筆都傳- break;
                    }
                    else
                    {
                        StrTxtData = StrTxtData + StrAns + “\n”;//修正傳送授權內容到紀錄文字檔符合SYDM/SYCG兩種模式
                    }
                }//if (SYCG_SendAnsData.authorizations.Count > 0)
            }//for (int l = 0; l < AL_sydmAll.Count; l++)
            //—把相同SYDM的授權命令集合一次傳送 ~ 依照SYDM進行授權資料分類+實際傳送 
        }
        //—SYDM和SYCG API呼叫並存實現
    }

    //—
    //修正DB派送授權的紀錄狀態語法讓DB支援派送失敗也可復原狀態值
    if (blncheck)//傳送成功
    {
        SQL = “DELETE FROM authorization_data WHERE state = ‘-100’;”;
        FileLib.logFile(“HW_SQL_track.log”, SQL + “-10-” + DateTime.Now.ToString(“HHmmss”));//增加HW_SQL_track.log功能,為了簡化SQL查詢做準備
        MySQL.InsertUpdateDelete(SQL);
        SQL = “UPDATE authorization_data SET state = ‘0’ WHERE state = ‘100’;”;
        FileLib.logFile(“HW_SQL_track.log”, SQL + “-11-” + DateTime.Now.ToString(“HHmmss”));//增加HW_SQL_track.log功能,為了簡化SQL查詢做準備
        MySQL.InsertUpdateDelete(SQL);
    }
    else//傳送失敗
    {
        SQL = “UPDATE authorization_data SET state = ‘-1’ WHERE state = ‘-100’;”;
        FileLib.logFile(“HW_SQL_track.log”, SQL + “-12-” + DateTime.Now.ToString(“HHmmss”));//增加HW_SQL_track.log功能,為了簡化SQL查詢做準備
        MySQL.InsertUpdateDelete(SQL);
        SQL = “UPDATE authorization_data SET state = ‘1’ WHERE state = ‘100’;”;
        FileLib.logFile(“HW_SQL_track.log”, SQL + “-13-” + DateTime.Now.ToString(“HHmmss”));//增加HW_SQL_track.log功能,為了簡化SQL查詢做準備
        MySQL.InsertUpdateDelete(SQL);
    }
    //—

    FileLib.TxtFile(“authorization_data.txt”, StrTxtData);//修正傳送授權內容到紀錄文字檔符合SYDM/SYCG兩種模式- FileLib.TxtFile(“authorization_data.txt”, StrAns);//授權JSON字串存檔(紀錄最後一次)

    //—
    //製作授權等待動畫
    m_intAuthorizationStep = 4;
    m_dblAuthorizationNow = 0;
    //—製作授權等待動畫

}//public static void sendData2HW()
//—建立傳送授權參數函數

//—
//建立傳送授權參數函數
public static void sendData2HW_20180605office()
{
    bool blnloop = false;
    String SQL = “”;
    String Strcard_id = “”;
    //–
    //sendData2HW()中增加抓取卡片內碼+卡片display+卡片pin_code+卡片效期+卡片APB
    String Strcard_code = “”;
    String Strcard_display = “”;
    String Strcard_pin_code = “”;
    String Strcard_valid_start = “”;
    String Strcard_valid_endle = “”;
    String Strcard_apb_level_value = “”;
    String Strcard_apb_apb_enabled = “”;

    //–
    String Strdoor_id = “”;

    String Strcontroller_model = “”;//控制器型態
    String Strcontroller_sn = “”;
    String Strcontroller_IP = “”;
    String Strcontroller_Port = “”;//增加sendData2HW()中controller_Port的抓取-呼叫Getsy_dm_Controller_id需要使用
    String Strconnetction_mode = “”;//控制器連線模式
    //—
    //新增一個ArrayList紀錄CONTROLLER的SYDM ID
    String Strsydm_id = “”;
    ArrayList AL_sydm_id = new ArrayList();
    AL_sydm_id.Clear();
    //—新增一個ArrayList紀錄CONTROLLER的SYDM ID

    ArrayList AL_AllDoorid = new ArrayList();//記錄同控制器下的門ID
    ArrayList AL_AnsData = new ArrayList();//存放所有授權資料

    bool blnDeleteCard = true;
    ControllerAuthorization SendAnsData = new ControllerAuthorization();//實際傳送變數值
    SendAnsData.authorizations.Clear();
    Authorization AnsAuthorization = new Authorization();//實際傳送變數值
    ControllerDelAuthorization DelSendAnsData = new ControllerDelAuthorization();//實際傳送變數值
    DelSendAnsData.authorizations.Clear();
    DelAuthorization DelAuthorization = new DelAuthorization();//實際傳送變數值

    //—
    //把相同SYDM的授權命令集合一次傳送 ~ 查詢系統目前所有SYDM
    ArrayList AL_sydmAll = new ArrayList();
    AL_sydmAll.Clear();
    MySqlDataReader ReaderSydmAll = MySQL.GetDataReader(“SELECT id,identifier FROM sydm;”);
    while (ReaderSydmAll.Read())
    {
        AL_sydmAll.Add(ReaderSydmAll[“id”].ToString() + “,” + ReaderSydmAll[“identifier”].ToString());//DB用id關聯,API用identifier操作
    }
    ReaderSydmAll.Close();
    //—把相同SYDM的授權命令集合一次傳送 ~ 查詢系統目前所有SYDM

    //—
    //修改授權時呼叫SYDM_GET_CONTROLLER_CONNECTION API位置,為了減少呼叫該API次數
    //—
    //SYDM和SYCG API呼叫並存實現
    if (!Main_Frm.pForm1.m_changeSYCGMode)//SYDM
    {
        Main_Frm.pForm1.m_blnAPI = HW_Net_API.getController_Connection();
    }
    else//SYCG
    {
        Main_Frm.pForm1.m_blnAPI = HW_Net_API.SYCG_getSYDMList();
        if (Main_Frm.pForm1.m_blnAPI)
        {
            HW_Net_API.m_Controller_Connection.controllers.Clear();
            for (int l = 0; l < Main_Frm.m_Sydms.sydms.Count; l++)
            {
                HW_Net_API.SYCG_callSYDMCommand(“SYDM_GET_CONTROLLER_CONNECTION”, “”, Main_Frm.m_Sydms.sydms[l].identifier.ToString());
            }
        }
    }
    //—SYDM和SYCG API呼叫並存實現
    //—修改授權時呼叫SYDM_GET_CONTROLLER_CONNECTION API位置,為了減少呼叫該API次數
    
    //—
    //授權呼叫SQL的維度降低-把card、door和控制器查詢的動作存放在記憶體中,當要再查時先找記憶體
    bool blnCardId2CardVarsCheck = false;
    String []StrCardId2CardVars = null;
    ArrayList AL_CardId2CardVarsAll = new ArrayList();
    
    bool blnDoorId2ControllerVarsCheck = false;
    String []StrDoorId2ControllerVars = null;
    ArrayList AL_DoorId2ControllerVarsAll = new ArrayList();
    
    bool blnControllerSN2DoorIdsCheck = false;
    String []StrControllerSN2DoorIds = null;
    ArrayList AL_ControllerSN2DoorIdsAll = new ArrayList();
    
    bool blncontroller_door_indexCheck = false;
    String []Strcontroller_door_index = null;
    ArrayList AL_controller_door_index = new ArrayList();
    
    int index=0;
    
    AL_CardId2CardVarsAll.Clear();
    AL_DoorId2ControllerVarsAll.Clear();
    AL_ControllerSN2DoorIdsAll.Clear();
    AL_controller_door_index.Clear();
    //—授權呼叫SQL的維度降低-把card、door和控制器查詢的動作存放在記憶體中,當要再查時先找記憶體

    //判斷是否還有未傳送的授權資料    ~   SELECT * FROM  authorization_data WHERE state <> 0;
    //找出 第一筆狀態>0 的資料,並找出對應控制器
    //—
    //實作傳送授權參數函數-10%
    SQL = “SELECT card_id,door_id FROM  authorization_data WHERE (state=1 OR state=-1) LIMIT 0,1;”;//授權呼叫SQL的維度降低-把所有單一SELECT語法加上LIMIT 0,1 //修改sendData2HW()中搜尋還未派送的授權資料-SQL = String.Format(“SELECT * FROM  authorization_data WHERE state <> ‘{0}’;”, 0);
    FileLib.logFile(“HW_SQL_track.log”, SQL + “-1-” + DateTime.Now.ToString(“HHmmss”));//增加HW_SQL_track.log功能,為了簡化SQL查詢做準備
    MySqlDataReader Reader_Data = MySQL.GetDataReader(SQL);
    if (Reader_Data.HasRows == true)
    {
        blnloop = Reader_Data.HasRows;
        Reader_Data.Read();
        Strcard_id = Reader_Data[“card_id”].ToString();
        Strdoor_id = Reader_Data[“door_id”].ToString();
        Reader_Data.Close();
        Reader_Data = null;
        //–
        //sendData2HW()中增加抓取卡片內碼+卡片display+卡片pin_code+卡片效期+卡片APB
        Strcard_code = “”;
        
        //—
        //授權呼叫SQL的維度降低-把card、door和控制器查詢的動作存放在記憶體中,當要再查時先找記憶體
        blnCardId2CardVarsCheck = false;
        StrCardId2CardVars = null;
        for(index=0;index<AL_CardId2CardVarsAll.Count;index++)
        {
            StrCardId2CardVars = AL_CardId2CardVarsAll[index].ToString().Split(‘,’);
            if(Strcard_id==StrCardId2CardVars[0])
            {
                blnCardId2CardVarsCheck = true;
                break;
            }
        }
        
        if(!blnCardId2CardVarsCheck)
        {                
            SQL = String.Format(“SELECT card_code,display,pin,apb_level_value FROM card WHERE id='{0}’ LIMIT 0,1;”, Strcard_id);//授權呼叫SQL的維度降低-把所有單一SELECT語法加上LIMIT 0,1 
            FileLib.logFile(“HW_SQL_track.log”, SQL + “-2-” + DateTime.Now.ToString(“HHmmss”));//增加HW_SQL_track.log功能,為了簡化SQL查詢做準備
            Reader_Data = MySQL.GetDataReader(SQL);
            Reader_Data.Read();
            Strcard_code = Reader_Data[“card_code”].ToString();
            Strcard_display = Reader_Data[“display”].ToString();
            Strcard_pin_code = Reader_Data[“pin”].ToString();
            Strcard_apb_level_value = Reader_Data[“apb_level_value”].ToString();
            Strcard_valid_start = “”;
            Strcard_valid_endle = “”;
            Strcard_apb_apb_enabled = “”;
            Reader_Data.Close();
            Reader_Data = null;
            AL_CardId2CardVarsAll.Add(Strcard_id + “,” + Strcard_code + “,” + Strcard_display + “,” + Strcard_pin_code + “,” + Strcard_apb_level_value);
        }
        else
        {
            Strcard_code = StrCardId2CardVars[1];
            Strcard_display = StrCardId2CardVars[2];
            Strcard_pin_code = StrCardId2CardVars[3];
            Strcard_apb_level_value = StrCardId2CardVars[4];
            Strcard_valid_start = “”;
            Strcard_valid_endle = “”;
            Strcard_apb_apb_enabled = “”;                    
        }
        //—授權呼叫SQL的維度降低-把card、door和控制器查詢的動作存放在記憶體中,當要再查時先找記憶體
        //–
    }
    else
    {
        Reader_Data.Close();
        Reader_Data = null;
        return;//沒有資料要傳送,直接離開
    }
    //—

    do
    {
        //紀錄對應控制器門數 和 型態    ~   SELECT c.model AS model,c.sn AS sn,ce.connetction_address AS IP,ce.connetction_mode AS connetction_mode FROM door AS d,controller AS c,controller_extend AS ce WHERE (c.sn=ce.controller_sn) AND (c.sn=d.controller_id) AND (d.id='{0}’); Strdoor_id
        //—
        //實作傳送授權參數函數-20%
        
        //—
        //授權呼叫SQL的維度降低-把card、door和控制器查詢的動作存放在記憶體中,當要再查時先找記憶體
        blnDoorId2ControllerVarsCheck = false;
        StrDoorId2ControllerVars = null;
        for(index=0;index<AL_DoorId2ControllerVarsAll.Count;index++)
        {
            StrDoorId2ControllerVars = AL_DoorId2ControllerVarsAll[index].ToString().Split(‘,’);
            if(Strdoor_id==StrDoorId2ControllerVars[0])
            {
                blnDoorId2ControllerVarsCheck = true;
                break;
            }
        }
        
        if(!blnDoorId2ControllerVarsCheck)
        {
            SQL = String.Format(“SELECT c.sydm_id AS sydm_id,c.model AS model,c.sn AS sn,ce.port AS port,ce.connetction_address AS IP,ce.connetction_mode AS connetction_mode FROM door AS d,controller AS c,controller_extend AS ce WHERE (c.sn=ce.controller_sn) AND (c.sn=d.controller_id) AND (d.id='{0}’) LIMIT 0,1;”, Strdoor_id);//授權呼叫SQL的維度降低-把所有單一SELECT語法加上LIMIT 0,1 //增加sendData2HW()中controller_Port的抓取-呼叫Getsy_dm_Controller_id需要使用 ~ SQL = String.Format(“SELECT c.model AS model,c.sn AS sn,ce.connetction_address AS IP,ce.connetction_mode AS connetction_mode FROM door AS d,controller AS c,controller_extend AS ce WHERE (c.sn=ce.controller_sn) AND (c.sn=d.controller_id) AND (d.id='{0}’);”, Strdoor_id);
            FileLib.logFile(“HW_SQL_track.log”, SQL + “-3-” + DateTime.Now.ToString(“HHmmss”));//增加HW_SQL_track.log功能,為了簡化SQL查詢做準備
            Reader_Data = MySQL.GetDataReader(SQL);
            while (Reader_Data.Read())
            {
                Strcontroller_model = Reader_Data[“model”].ToString(); ;//控制器型態
                Strcontroller_sn = Reader_Data[“sn”].ToString(); ;
                Strcontroller_IP = Reader_Data[“IP”].ToString(); ;
                Strcontroller_Port = Reader_Data[“port”].ToString();//增加sendData2HW()中controller_Port的抓取-呼叫Getsy_dm_Controller_id需要使用
                Strconnetction_mode = Reader_Data[“connetction_mode”].ToString();//控制器連線模式

                //—
                //新增一個ArrayList紀錄CONTROLLER的SYDM ID
                Strsydm_id = Reader_Data[“sydm_id”].ToString();
                AL_sydm_id.Add(Strsydm_id);
                //—新增一個ArrayList紀錄CONTROLLER的SYDM ID
                
                AL_DoorId2ControllerVarsAll.Add(Strdoor_id + “,” + Strcontroller_model + “,” + Strcontroller_sn + “,” + Strcontroller_IP + “,” + Strcontroller_Port + “,” + Strconnetction_mode + “,” + Strsydm_id);
                break;
            }
            Reader_Data.Close();
            Reader_Data = null;
        }
        else
        {
                Strcontroller_model = StrDoorId2ControllerVars[1]; ;//控制器型態
                Strcontroller_sn = StrDoorId2ControllerVars[2]; ;
                Strcontroller_IP = StrDoorId2ControllerVars[3]; ;
                Strcontroller_Port = StrDoorId2ControllerVars[4];//增加sendData2HW()中controller_Port的抓取-呼叫Getsy_dm_Controller_id需要使用
                Strconnetction_mode = StrDoorId2ControllerVars[5];//控制器連線模式

                //—
                //新增一個ArrayList紀錄CONTROLLER的SYDM ID
                Strsydm_id = StrDoorId2ControllerVars[6];
                AL_sydm_id.Add(Strsydm_id);                    
        }
        //—授權呼叫SQL的維度降低-把card、door和控制器查詢的動作存放在記憶體中,當要再查時先找記憶體
        //—

        //找出該控制器下所有門且同一張卡的全部授權資料記錄在ArrayList中
        //  AL_AllDoorid    ~   SELECT id FROM door WHERE controller_id='{0}’; Strcontroller_sn
        //  AL_AnsData      ~   SELECT * FROM  authorization_data WHERE (card_id='{0}’) AND (door_id='{1}’); Strcard_id AL_AllDoorid
        //—
        //實作傳送授權參數函數-30%
        AL_AllDoorid.Clear();
        //—
        //授權呼叫SQL的維度降低-把card、door和控制器查詢的動作存放在記憶體中,當要再查時先找記憶體
        blnControllerSN2DoorIdsCheck = false;
        StrControllerSN2DoorIds = null;
        String StrAllDooridBuf=””;
        for(index=0;index<AL_ControllerSN2DoorIdsAll.Count;index++)
        {
            StrControllerSN2DoorIds = AL_ControllerSN2DoorIdsAll[index].ToString().Split(‘,’);
            if(Strcontroller_sn==StrControllerSN2DoorIds[0])
            {
                blnControllerSN2DoorIdsCheck = true;
                break;
            }
        }

        if(!blnControllerSN2DoorIdsCheck)
        {
            SQL = String.Format(“SELECT id FROM door WHERE controller_id='{0}’;”, Strcontroller_sn);
            FileLib.logFile(“HW_SQL_track.log”, SQL + “-4-” + DateTime.Now.ToString(“HHmmss”));//增加HW_SQL_track.log功能,為了簡化SQL查詢做準備
            Reader_Data = MySQL.GetDataReader(SQL);
            while (Reader_Data.Read())
            {
                AL_AllDoorid.Add(Reader_Data[“id”].ToString());
            }
            Reader_Data.Close();
            Reader_Data = null;
            
            StrAllDooridBuf = Strcontroller_sn;
            for(index=0;index<AL_AllDoorid.Count;index++)
            {
                StrAllDooridBuf += “,” + AL_AllDoorid[index].ToString();
            }
            AL_ControllerSN2DoorIdsAll.Add(StrAllDooridBuf);
        }
        else
        {
            for(index=1;index < StrControllerSN2DoorIds.Length;index++)
            {
                AL_AllDoorid.Add(StrControllerSN2DoorIds[index]);
            }                    
        }
        //—授權呼叫SQL的維度降低-把card、door和控制器查詢的動作存放在記憶體中,當要再查時先找記憶體
        
        AL_AnsData.Clear();
        
        StrAllDooridBuf=””;
        for (int i = 0; i < AL_AllDoorid.Count; i++)
        {
            if(i<(AL_AllDoorid.Count-1))
            {
                StrAllDooridBuf += AL_AllDoorid[i].ToString() + “,”;
            }
            else
            {
                StrAllDooridBuf += AL_AllDoorid[i].ToString();
            }
        }
        StrAllDooridBuf = “(” + StrAllDooridBuf + “)”;
        
        SQL = String.Format(“SELECT * FROM  authorization_data WHERE (card_id='{0}’) AND (door_id IN {1});”, Strcard_id, StrAllDooridBuf);//授權呼叫SQL的維度降低-把所有迴圈包覆的SQL全部改成 IN(….)型式
        FileLib.logFile(“HW_SQL_track.log”, SQL + “-5-” + DateTime.Now.ToString(“HHmmss”));//增加HW_SQL_track.log功能,為了簡化SQL查詢做準備
        Reader_Data = MySQL.GetDataReader(SQL);
        while (Reader_Data.Read())
        {

            /*
            CREATE TABLE IF NOT EXISTS `authorization_data` (
              `card_id` int(11) NOT NULL,
              `door_id` int(11) NOT NULL,
              `type` int(11) NOT NULL DEFAULT ‘0’,
              `block` varchar(10) NOT NULL DEFAULT ‘0,0,0’,
              `level` int(11) NOT NULL DEFAULT ‘1’,
              `access_time_1_start` time NOT NULL DEFAULT ’00:00:00′,
              `access_time_1_end` time NOT NULL DEFAULT ’23:59:00′,
              `access_time_2_start` time NOT NULL DEFAULT ’00:00:00′,
              `access_time_2_end` time NOT NULL DEFAULT ’00:00:00′,
              `access_time_3_start` time NOT NULL DEFAULT ’00:00:00′,
              `access_time_3_end` time NOT NULL DEFAULT ’00:00:00′,
              `week_plan` int(11) NOT NULL DEFAULT ‘0’,
              `available_date_start` varchar(25) NOT NULL DEFAULT ‘now’,
              `available_date_end` varchar(25) NOT NULL DEFAULT ‘forever’,
              `state` int(11) NOT NULL DEFAULT ‘0’ COMMENT ‘[-1]->del,[0]->finish,[1]->send’,
              PRIMARY KEY (`card_id`,`door_id`)
            ) ENGINE=MyISAM DEFAULT CHARSET=utf8;                          
            */
            AnsData AnsData00 = new AnsData();
            AnsData00.Strcard_id = Reader_Data[“card_id”].ToString();
            AnsData00.Strdoor_id = Reader_Data[“door_id”].ToString();
            AnsData00.Strtype = Reader_Data[“type”].ToString();
            AnsData00.Strblock = Reader_Data[“block”].ToString();
            AnsData00.Strlevel = Reader_Data[“level”].ToString();
            AnsData00.Straccess_time_1_start = Reader_Data[“access_time_1_start”].ToString();
            AnsData00.Straccess_time_1_end = Reader_Data[“access_time_1_end”].ToString();
            AnsData00.Straccess_time_2_start = Reader_Data[“access_time_2_start”].ToString();
            AnsData00.Straccess_time_2_end = Reader_Data[“access_time_2_end”].ToString();
            AnsData00.Straccess_time_3_start = Reader_Data[“access_time_3_start”].ToString();
            AnsData00.Straccess_time_3_end = Reader_Data[“access_time_3_end”].ToString();
            AnsData00.Strweek_plan = Reader_Data[“week_plan”].ToString();
            AnsData00.Stravailable_date_start = Reader_Data[“available_date_start”].ToString();
            AnsData00.Stravailable_date_end = Reader_Data[“available_date_end”].ToString();
            AnsData00.state = Convert.ToInt32(Reader_Data[“state”].ToString());//加刪旗標(-1,0,1)刪,預設,加
            AnsData00.flag = 0;
            AL_AnsData.Add(AnsData00);

        }//while (Reader_Data.Read())
        Reader_Data.Close();
        Reader_Data = null;
        
        //—

        //按照控制器型態和門數 組合(state>0)出正確的傳送參數 並傳送
        //SELECT controller_door_index FROM door WHERE id='{0}’; 
        //—
        //實作傳送授權參數函數-40%
        int[] doorstate = null;//紀錄同一控制器開門狀態
        //–
        //sendData2HW()中增加計算那些門或那些樓層可通行的flag
        int door_accessable_flags = 0;
        int[] floor_flags_list = new int[16];
        for (int l = 0; l < floor_flags_list.Length; l++)
        {
            floor_flags_list[l] = 0;
        }
        //–

        AuthorizedConfigurationList[] AnsAuthorizedConfigurationList = null;//sendData2HW()中增加門參整合用變數

        switch (Convert.ToInt32(Strcontroller_model))
        {
            case 1://單門模式
                doorstate = new int[1];
                //–
                //sendData2HW()中增加門參整合用變數
                AnsAuthorizedConfigurationList = new AuthorizedConfigurationList[1];
                AnsAuthorizedConfigurationList[0] = new AuthorizedConfigurationList();
                //–
                break;
            case 2://4門模式
                doorstate = new int[4];
                //–
                //sendData2HW()中增加門參整合用變數
                AnsAuthorizedConfigurationList = new AuthorizedConfigurationList[4];
                for (int l = 0; l < 4; l++)
                {
                    AnsAuthorizedConfigurationList[l] = new AuthorizedConfigurationList();
                }
                //–
                break;
            case 3://4門強制配對模式
                doorstate = new int[4];
                //–
                //sendData2HW()中增加門參整合用變數
                AnsAuthorizedConfigurationList = new AuthorizedConfigurationList[4];
                for (int l = 0; l < 4; l++)
                {
                    AnsAuthorizedConfigurationList[l] = new AuthorizedConfigurationList();
                }
                //–
                break;
            case 4://12門模式
                doorstate = new int[12];
                //–
                //sendData2HW()中增加門參整合用變數
                AnsAuthorizedConfigurationList = new AuthorizedConfigurationList[1];
                AnsAuthorizedConfigurationList[0] = new AuthorizedConfigurationList();
                //–
                break;
            case 5://電梯/儲物櫃模式
                doorstate = new int[128];
                //–
                //sendData2HW()中增加門參整合用變數
                AnsAuthorizedConfigurationList = new AuthorizedConfigurationList[1];
                AnsAuthorizedConfigurationList[0] = new AuthorizedConfigurationList();
                //–
                break;
        }
        for (int i = 0; i < doorstate.Length; i++)
        {
            doorstate[i] = 0;
        }

        CalculatePassTime buf_CalculatePassTime = new CalculatePassTime();//把資料從『門(N個)VS卡』-> 『控(1個)VS卡』,合併通行時段變數
        for (int i = 0; i < AL_AnsData.Count; i++)
        {
            Strcard_valid_start = ((AnsData)AL_AnsData[i]).Stravailable_date_start;
            Strcard_valid_endle = ((AnsData)AL_AnsData[i]).Stravailable_date_end;

            int controller_door_index = 0;
            
            //—
            //授權呼叫SQL的維度降低-把card、door和控制器查詢的動作存放在記憶體中,當要再查時先找記憶體
            blncontroller_door_indexCheck = false;
            Strcontroller_door_index = null;
            for(index=0;index<AL_controller_door_index.Count;index++)
            {
                Strcontroller_door_index = AL_controller_door_index[index].ToString().Split(‘,’);
                if(Strdoor_id==Strcontroller_door_index[0])
                {
                    blncontroller_door_indexCheck = true;
                    break;
                }
            }
            
            if(!blncontroller_door_indexCheck)
            {
                SQL = String.Format(“SELECT controller_door_index FROM door WHERE id='{0}’ LIMIT 0,1;”, ((AnsData)AL_AnsData[i]).Strdoor_id);//授權呼叫SQL的維度降低-把所有單一SELECT語法加上LIMIT 0,1
                FileLib.logFile(“HW_SQL_track.log”, SQL + “-6-” + DateTime.Now.ToString(“HHmmss”));//增加HW_SQL_track.log功能,為了簡化SQL查詢做準備
                Reader_Data = MySQL.GetDataReader(SQL);
                while (Reader_Data.Read())
                {
                    controller_door_index = Convert.ToInt32(Reader_Data[“controller_door_index”].ToString());
                    break;
                }
                Reader_Data.Close();
                Reader_Data = null;
                
                AL_controller_door_index.Add(Strdoor_id + “,” + controller_door_index);
            }
            else
            {
                controller_door_index = Convert.ToInt32(Strcontroller_door_index[1]);
            }
            //授權呼叫SQL的維度降低-把card、door和控制器查詢的動作存放在記憶體中,當要再查時先找記憶體
            
            if (((AnsData)AL_AnsData[i]).state >= 0)
            {
                doorstate[controller_door_index – 1] = 1;//該控制器的第 controller_door_index 門可通行

                //–
                //sendData2HW()中增加計算那些門或那些樓層可通行的flag
                if (Convert.ToInt32(Strcontroller_model) != 5)//非電梯
                {
                    door_accessable_flags += (int)Math.Pow(2, (controller_door_index – 1));
                }
                else//電梯
                {
                    /*
                    128 064 032 016 008 004 002 001
                    ——————————-
                    7   6   5   4   3   2   1   0
                    15  14  13  12  11  10  9   8
                    23  22  21  20  19  18  17  16
                            
                    X=6,13 –> X=(controller_door_index – 1)
                    X<8*(l+1) –>l 就是組別
                    2^{8-[8*(l+1) – X]} –> value
                    */
                    int l = 1;
                    do
                    {
                        if ((l * 8) > (controller_door_index – 1))
                        {
                            int k = 8 – ((l * 8) – (controller_door_index – 1));
                            floor_flags_list[(l – 1)] += (int)Math.Pow(2, k);
                            break;
                        }
                        l++;
                    } while (l <= 16);
                }
                //–

            }
            else
            {
                doorstate[controller_door_index – 1] = 0;//該控制器的第 controller_door_index 門不可通行
            }

            //–
            //把資料從『門(N個)VS卡』-> 『控(1個)VS卡』
            /*
            單門,12門,電梯 ->合併一份門參
            4門 -> 4份門參
            */
            if ((Convert.ToInt32(Strcontroller_model) == 2) || (Convert.ToInt32(Strcontroller_model) == 3))//4門 -> 4份門參
            {
                string[] strs00 = ((AnsData)AL_AnsData[i]).Strblock.Split(‘,’);
                if (Convert.ToInt32(strs00[2]) == 0)
                {
                    Strcard_apb_apb_enabled = “1”;
                }
                else
                {
                    Strcard_apb_apb_enabled = “0”;
                }
                AnsAuthorizedConfigurationList[controller_door_index – 1].card_disabled = Convert.ToInt32(strs00[0]);
                AnsAuthorizedConfigurationList[controller_door_index – 1].card_in_black = Convert.ToInt32(strs00[1]);
                AnsAuthorizedConfigurationList[controller_door_index – 1].card_level = Convert.ToInt32(((AnsData)AL_AnsData[i]).Strlevel);
                AnsAuthorizedConfigurationList[controller_door_index – 1].card_type = Convert.ToInt32(((AnsData)AL_AnsData[i]).Strtype);

                TimeRangeList bufTimeRangeList01 = new TimeRangeList();
                TimeRangeList bufTimeRangeList02 = new TimeRangeList();
                TimeRangeList bufTimeRangeList03 = new TimeRangeList();
                string[] strs01 = ((AnsData)AL_AnsData[i]).Straccess_time_1_start.Split(‘:’);
                string[] strs02 = ((AnsData)AL_AnsData[i]).Straccess_time_1_end.Split(‘:’);
                bufTimeRangeList01.start_timestamp = Convert.ToInt32(strs01[0]) * 3600 + Convert.ToInt32(strs01[1]) * 60 + Convert.ToInt32(strs01[2]);
                bufTimeRangeList01.endle_timestamp = Convert.ToInt32(strs02[0]) * 3600 + Convert.ToInt32(strs02[1]) * 60 + Convert.ToInt32(strs02[2]);
                AnsAuthorizedConfigurationList[controller_door_index – 1].time_range_list.Add(bufTimeRangeList01);

                string[] strs03 = ((AnsData)AL_AnsData[i]).Straccess_time_2_start.Split(‘:’);
                string[] strs04 = ((AnsData)AL_AnsData[i]).Straccess_time_2_end.Split(‘:’);
                bufTimeRangeList02.start_timestamp = Convert.ToInt32(strs03[0]) * 3600 + Convert.ToInt32(strs03[1]) * 60 + Convert.ToInt32(strs03[2]);
                bufTimeRangeList02.endle_timestamp = Convert.ToInt32(strs04[0]) * 3600 + Convert.ToInt32(strs04[1]) * 60 + Convert.ToInt32(strs04[2]);
                AnsAuthorizedConfigurationList[controller_door_index – 1].time_range_list.Add(bufTimeRangeList02);

                string[] strs05 = ((AnsData)AL_AnsData[i]).Straccess_time_3_start.Split(‘:’);
                string[] strs06 = ((AnsData)AL_AnsData[i]).Straccess_time_3_end.Split(‘:’);
                bufTimeRangeList03.start_timestamp = Convert.ToInt32(strs05[0]) * 3600 + Convert.ToInt32(strs05[1]) * 60 + Convert.ToInt32(strs05[2]);
                bufTimeRangeList03.endle_timestamp = Convert.ToInt32(strs06[0]) * 3600 + Convert.ToInt32(strs06[1]) * 60 + Convert.ToInt32(strs06[2]);
                AnsAuthorizedConfigurationList[controller_door_index – 1].time_range_list.Add(bufTimeRangeList03);

                AnsAuthorizedConfigurationList[controller_door_index – 1].week_plan_flags = Convert.ToInt32(((AnsData)AL_AnsData[i]).Strweek_plan);
            }
            else//單門,12門,電梯 ->合併一份門參
            {
                string[] strs00 = ((AnsData)AL_AnsData[i]).Strblock.Split(‘,’);
                if (Convert.ToInt32(strs00[2]) == 0)
                {
                    Strcard_apb_apb_enabled = “1”;
                }
                else
                {
                    Strcard_apb_apb_enabled = “0”;
                }
                if (AnsAuthorizedConfigurationList[0].card_disabled < Convert.ToInt32(strs00[0]))
                {
                    AnsAuthorizedConfigurationList[0].card_disabled = Convert.ToInt32(strs00[0]);
                }
                if (AnsAuthorizedConfigurationList[0].card_in_black < Convert.ToInt32(strs00[1]))
                {
                    AnsAuthorizedConfigurationList[0].card_in_black = Convert.ToInt32(strs00[1]);
                }

                if (AnsAuthorizedConfigurationList[0].card_level < Convert.ToInt32(((AnsData)AL_AnsData[i]).Strlevel))
                {
                    AnsAuthorizedConfigurationList[0].card_level = Convert.ToInt32(((AnsData)AL_AnsData[i]).Strlevel);
                }

                if (AnsAuthorizedConfigurationList[0].card_type < Convert.ToInt32(((AnsData)AL_AnsData[i]).Strtype))
                {
                    AnsAuthorizedConfigurationList[0].card_type = Convert.ToInt32(((AnsData)AL_AnsData[i]).Strtype);
                }

                if (AnsAuthorizedConfigurationList[0].week_plan_flags < Convert.ToInt32(((AnsData)AL_AnsData[i]).Strweek_plan))
                {
                    AnsAuthorizedConfigurationList[0].week_plan_flags = Convert.ToInt32(((AnsData)AL_AnsData[i]).Strweek_plan);
                }

                AnsAuthorizedConfigurationList[0].time_range_list.Clear();
                buf_CalculatePassTime.SetInput(((AnsData)AL_AnsData[i]).Straccess_time_1_start, ((AnsData)AL_AnsData[i]).Straccess_time_1_end, true);
                buf_CalculatePassTime.SetInput(((AnsData)AL_AnsData[i]).Straccess_time_2_start, ((AnsData)AL_AnsData[i]).Straccess_time_2_end, true);
                buf_CalculatePassTime.SetInput(((AnsData)AL_AnsData[i]).Straccess_time_3_start, ((AnsData)AL_AnsData[i]).Straccess_time_3_end, true);
                TimeRangeList bufTimeRangeList01 = new TimeRangeList();
                TimeRangeList bufTimeRangeList02 = new TimeRangeList();
                TimeRangeList bufTimeRangeList03 = new TimeRangeList();
                int count = buf_CalculatePassTime.CalOutput();
                switch (count)
                {
                    case 1:
                        string[] strs01 = buf_CalculatePassTime.m_StrS1.Split(‘:’);
                        string[] strs02 = buf_CalculatePassTime.m_StrE1.Split(‘:’);
                        string[] strs03 = “00:00”.Split(‘:’);
                        string[] strs04 = “00:00”.Split(‘:’);
                        string[] strs05 = “00:00”.Split(‘:’);
                        string[] strs06 = “00:00”.Split(‘:’);
                        bufTimeRangeList01.start_timestamp = Convert.ToInt32(strs01[0]) * 3600 + Convert.ToInt32(strs01[1]) * 60;
                        bufTimeRangeList01.endle_timestamp = Convert.ToInt32(strs02[0]) * 3600 + Convert.ToInt32(strs02[1]) * 60;
                        AnsAuthorizedConfigurationList[0].time_range_list.Add(bufTimeRangeList01);
                        bufTimeRangeList02.start_timestamp = Convert.ToInt32(strs03[0]) * 3600 + Convert.ToInt32(strs03[1]) * 60;
                        bufTimeRangeList02.endle_timestamp = Convert.ToInt32(strs04[0]) * 3600 + Convert.ToInt32(strs04[1]) * 60;
                        AnsAuthorizedConfigurationList[0].time_range_list.Add(bufTimeRangeList02);
                        bufTimeRangeList03.start_timestamp = Convert.ToInt32(strs05[0]) * 3600 + Convert.ToInt32(strs05[1]) * 60;
                        bufTimeRangeList03.endle_timestamp = Convert.ToInt32(strs06[0]) * 3600 + Convert.ToInt32(strs06[1]) * 60;
                        AnsAuthorizedConfigurationList[0].time_range_list.Add(bufTimeRangeList03);
                        break;
                    case 2:
                        string[] strs07 = buf_CalculatePassTime.m_StrS1.Split(‘:’);
                        string[] strs08 = buf_CalculatePassTime.m_StrE1.Split(‘:’);
                        string[] strs09 = buf_CalculatePassTime.m_StrS2.Split(‘:’);
                        string[] strs10 = buf_CalculatePassTime.m_StrE2.Split(‘:’);
                        string[] strs11 = “00:00”.Split(‘:’);
                        string[] strs12 = “00:00”.Split(‘:’);
                        bufTimeRangeList01.start_timestamp = Convert.ToInt32(strs07[0]) * 3600 + Convert.ToInt32(strs07[1]) * 60;
                        bufTimeRangeList01.endle_timestamp = Convert.ToInt32(strs08[0]) * 3600 + Convert.ToInt32(strs08[1]) * 60;
                        AnsAuthorizedConfigurationList[0].time_range_list.Add(bufTimeRangeList01);
                        bufTimeRangeList02.start_timestamp = Convert.ToInt32(strs09[0]) * 3600 + Convert.ToInt32(strs09[1]) * 60;
                        bufTimeRangeList02.endle_timestamp = Convert.ToInt32(strs10[0]) * 3600 + Convert.ToInt32(strs10[1]) * 60;
                        AnsAuthorizedConfigurationList[0].time_range_list.Add(bufTimeRangeList02);
                        bufTimeRangeList03.start_timestamp = Convert.ToInt32(strs11[0]) * 3600 + Convert.ToInt32(strs11[1]) * 60;
                        bufTimeRangeList03.endle_timestamp = Convert.ToInt32(strs12[0]) * 3600 + Convert.ToInt32(strs12[1]) * 60;
                        AnsAuthorizedConfigurationList[0].time_range_list.Add(bufTimeRangeList03);
                        break;
                    case 3:
                        string[] strs13 = buf_CalculatePassTime.m_StrS1.Split(‘:’);
                        string[] strs14 = buf_CalculatePassTime.m_StrE1.Split(‘:’);
                        string[] strs15 = buf_CalculatePassTime.m_StrS2.Split(‘:’);
                        string[] strs16 = buf_CalculatePassTime.m_StrE2.Split(‘:’);
                        string[] strs17 = buf_CalculatePassTime.m_StrS3.Split(‘:’);
                        string[] strs18 = buf_CalculatePassTime.m_StrE3.Split(‘:’);
                        bufTimeRangeList01.start_timestamp = Convert.ToInt32(strs13[0]) * 3600 + Convert.ToInt32(strs13[1]) * 60;
                        bufTimeRangeList01.endle_timestamp = Convert.ToInt32(strs14[0]) * 3600 + Convert.ToInt32(strs14[1]) * 60;
                        AnsAuthorizedConfigurationList[0].time_range_list.Add(bufTimeRangeList01);
                        bufTimeRangeList02.start_timestamp = Convert.ToInt32(strs15[0]) * 3600 + Convert.ToInt32(strs15[1]) * 60;
                        bufTimeRangeList02.endle_timestamp = Convert.ToInt32(strs16[0]) * 3600 + Convert.ToInt32(strs16[1]) * 60;
                        AnsAuthorizedConfigurationList[0].time_range_list.Add(bufTimeRangeList02);
                        bufTimeRangeList03.start_timestamp = Convert.ToInt32(strs17[0]) * 3600 + Convert.ToInt32(strs17[1]) * 60;
                        bufTimeRangeList03.endle_timestamp = Convert.ToInt32(strs18[0]) * 3600 + Convert.ToInt32(strs18[1]) * 60;
                        AnsAuthorizedConfigurationList[0].time_range_list.Add(bufTimeRangeList03);
                        break;
                    default:
                        string[] strs19 = “00:00”.Split(‘:’);
                        string[] strs20 = “00:00”.Split(‘:’);
                        string[] strs21 = “00:00”.Split(‘:’);
                        string[] strs22 = “00:00”.Split(‘:’);
                        string[] strs23 = “00:00”.Split(‘:’);
                        string[] strs24 = “00:00”.Split(‘:’);
                        bufTimeRangeList01.start_timestamp = Convert.ToInt32(strs19[0]) * 3600 + Convert.ToInt32(strs19[1]) * 60;
                        bufTimeRangeList01.endle_timestamp = Convert.ToInt32(strs20[0]) * 3600 + Convert.ToInt32(strs20[1]) * 60;
                        AnsAuthorizedConfigurationList[0].time_range_list.Add(bufTimeRangeList01);
                        bufTimeRangeList02.start_timestamp = Convert.ToInt32(strs21[0]) * 3600 + Convert.ToInt32(strs21[1]) * 60;
                        bufTimeRangeList02.endle_timestamp = Convert.ToInt32(strs22[0]) * 3600 + Convert.ToInt32(strs22[1]) * 60;
                        AnsAuthorizedConfigurationList[0].time_range_list.Add(bufTimeRangeList02);
                        bufTimeRangeList03.start_timestamp = Convert.ToInt32(strs23[0]) * 3600 + Convert.ToInt32(strs23[1]) * 60;
                        bufTimeRangeList03.endle_timestamp = Convert.ToInt32(strs24[0]) * 3600 + Convert.ToInt32(strs24[1]) * 60;
                        AnsAuthorizedConfigurationList[0].time_range_list.Add(bufTimeRangeList03);
                        break;
                }
            }
            //–

        }//for (int i = 0; i < AL_AnsData.Count; i++)

        //整合傳送參數-SendAnsData
        //整合傳送參數-AnsAuthorization

        //—
        //修改授權時呼叫SYDM_GET_CONTROLLER_CONNECTION API位置,為了減少呼叫該API次數
        /*
        //—
        //SYDM和SYCG API呼叫並存實現
        if (!Main_Frm.pForm1.m_changeSYCGMode)//SYDM
        {
            Main_Frm.pForm1.m_blnAPI = HW_Net_API.getController_Connection();
        }
        else//SYCG
        {
            Main_Frm.pForm1.m_blnAPI = HW_Net_API.SYCG_getSYDMList();
            if (Main_Frm.pForm1.m_blnAPI)
            {
                HW_Net_API.m_Controller_Connection.controllers.Clear();
                for (int l = 0; l < Main_Frm.m_Sydms.sydms.Count; l++)
                {
                    HW_Net_API.SYCG_callSYDMCommand(“SYDM_GET_CONTROLLER_CONNECTION”, “”, Main_Frm.m_Sydms.sydms[l].identifier.ToString());
                }
            }
        }
        //—SYDM和SYCG API呼叫並存實現
        */
        //—修改授權時呼叫SYDM_GET_CONTROLLER_CONNECTION API位置,為了減少呼叫該API次數

        //–
        //AnsAuthorization指定SYDM控制器ID-呼叫Getsy_dm_Controller_id
        AnsAuthorization.identifier = Main_Frm.pForm1.Getsy_dm_Controller_id(Strconnetction_mode, Strcontroller_IP, Strcontroller_Port);
        //–

        //–
        //AnsAuthorization指定指定卡號-sendData2HW()中增加抓取卡片內碼
        AnsAuthorization.card_unique_identifier = Strcard_code;
        //–

        //–
        //AnsAuthorization指定APB參數
        AnsAuthorization.apb_enabled = Convert.ToInt32(Strcard_apb_apb_enabled);
        AnsAuthorization.apb_level_value = Convert.ToInt32(Strcard_apb_level_value);
        //–

        //–
        //AnsAuthorization指定display_text參數
        AnsAuthorization.display_text = Strcard_display;
        //–

        //–
        //AnsAuthorization指定pin_code參數
        AnsAuthorization.pin_code = Strcard_pin_code;
        //–

        //–
        //AnsAuthorization指定valid_start_timestamp+valid_endle_timestamp參數
        DateTime dt0 = new DateTime(2000, 1, 1, 0, 0, 0);
        DateTime dt1;
        DateTime dt2;
        try
        {
            dt1 = Convert.ToDateTime(Strcard_valid_start);
        }
        catch
        {
            dt1 = new DateTime(2000, 1, 1, 0, 0, 0);//卡片時間匯入未填在授權運算時自動轉換成2000/01/01和2068/01/01
        }
        try
        {
            dt2 = Convert.ToDateTime(Strcard_valid_endle);
        }
        catch
        {
            dt2 = new DateTime(2068, 1, 1, 0, 0, 0);//卡片時間匯入未填在授權運算時自動轉換成2000/01/01和2068/01/01
        }
        TimeSpan ts01 = dt1 – dt0;
        TimeSpan ts02 = dt2 – dt0;
        AnsAuthorization.valid_start_timestamp = (Int64)ts01.TotalSeconds;
        AnsAuthorization.valid_endle_timestamp = (Int64)ts02.TotalSeconds;
        //–

        //–
        //sendData2HW()中增加計算那些門或那些樓層可通行的flag
        AnsAuthorization.door_accessable_flags = door_accessable_flags;
        for (int l = 0; l < floor_flags_list.Length; l++)
        {
            AnsAuthorization.floor_flags_list.Add(floor_flags_list[l]);
        }
        //–

        //–
        //把資料從『門(N個)VS卡』-> 『控(1個)VS卡』
        for (int l = 0; l < AnsAuthorizedConfigurationList.Length; l++)
        {
            AnsAuthorization.authorized_configuration_list.Add(AnsAuthorizedConfigurationList[l]);
        }
        //–

        for (int i = 0; i < doorstate.Length; i++)
        {
            if (doorstate[i] != 0)
            {
                blnDeleteCard = false;
                break;
            }
        }

        if (blnDeleteCard == true)
        {
            //執行刪卡
            DelAuthorization.identifier = AnsAuthorization.identifier;
            DelAuthorization.card_unique_identifier = AnsAuthorization.card_unique_identifier;
            DelSendAnsData.authorizations.Add(DelAuthorization);

            DelAuthorization = null;
            DelAuthorization = new DelAuthorization();

        }
        else
        {
            //執行傳卡
            SendAnsData.authorizations.Add(AnsAuthorization);

            AnsAuthorization = null;
            AnsAuthorization = new Authorization();
        }
        //—

        //修改對應已傳送的授權資料
        //直接刪除state=-1的授權資料
        //複寫同卡ID和門ID的授權資料
        //—
        //實作傳送授權參數函數-50%
        SQL = “”;
        for (int i = 0; i < AL_AnsData.Count; i++)
        {
            if (((AnsData)AL_AnsData[i]).state <= 0)
            {
                //SQL = String.Format(“DELETE FROM authorization_data WHERE (card_id='{0}’) AND (door_id='{1}’);”, ((AnsData)AL_AnsData[i]).Strcard_id, ((AnsData)AL_AnsData[i]).Strdoor_id);
                SQL += String.Format(“UPDATE authorization_data SET state = ‘-100′ WHERE (card_id='{0}’) AND (door_id='{1}’);”, ((AnsData)AL_AnsData[i]).Strcard_id, ((AnsData)AL_AnsData[i]).Strdoor_id);//授權呼叫SQL的維度降低-把所有迴圈包覆的SQL全部改成 IN(….)型式 //修正DB派送授權的紀錄狀態語法讓DB支援派送失敗也可復原狀態值
            }
            else
            {
                //SQL = String.Format(“UPDATE authorization_data SET state = ‘0’ WHERE (card_id='{0}’) AND (door_id='{1}’);”, ((AnsData)AL_AnsData[i]).Strcard_id, ((AnsData)AL_AnsData[i]).Strdoor_id);
                SQL += String.Format(“UPDATE authorization_data SET state = ‘100’ WHERE (card_id='{0}’) AND (door_id='{1}’);”, ((AnsData)AL_AnsData[i]).Strcard_id, ((AnsData)AL_AnsData[i]).Strdoor_id);//授權呼叫SQL的維度降低-把所有迴圈包覆的SQL全部改成 IN(….)型式 //修正DB派送授權的紀錄狀態語法讓DB支援派送失敗也可復原狀態值
            }
        }
        FileLib.logFile(“HW_SQL_track.log”, SQL + “-9-” + DateTime.Now.ToString(“HHmmss”));//增加HW_SQL_track.log功能,為了簡化SQL查詢做準備
        MySQL.InsertUpdateDelete(SQL);
        //—

        //判斷是否還有未傳送的授權資料    ~   SELECT * FROM  `authorization_data` WHERE state <> 0;
        //找出 第一筆狀態>0 的資料,並找出對應控制器
        //—
        //實作傳送授權參數函數-10%
        SQL = “SELECT card_id,door_id FROM  authorization_data WHERE (state=1 OR state=-1) LIMIT 0,1;”;//授權呼叫SQL的維度降低-把所有單一SELECT語法加上LIMIT 0,1 //SQL = String.Format(“SELECT * FROM  authorization_data WHERE state <> ‘{0}’;”, 0);
        FileLib.logFile(“HW_SQL_track.log”, SQL + “-7-” + DateTime.Now.ToString(“HHmmss”));//增加HW_SQL_track.log功能,為了簡化SQL查詢做準備
        Reader_Data = MySQL.GetDataReader(SQL);
        if (Reader_Data.HasRows == true)
        {
            blnloop = Reader_Data.HasRows;
            Reader_Data.Read();
            Strcard_id = Reader_Data[“card_id”].ToString();
            Strdoor_id = Reader_Data[“door_id”].ToString();
            Reader_Data.Close();
            Reader_Data = null;
            //–
            //sendData2HW()中增加抓取卡片內碼+卡片display+卡片pin_code+卡片效期+卡片APB
            Strcard_code = “”;
            
            //—
            //授權呼叫SQL的維度降低-把card、door和控制器查詢的動作存放在記憶體中,當要再查時先找記憶體
            blnCardId2CardVarsCheck = false;
            StrCardId2CardVars = null;
            for(index=0;index<AL_CardId2CardVarsAll.Count;index++)
            {
                StrCardId2CardVars = AL_CardId2CardVarsAll[index].ToString().Split(‘,’);
                if(Strcard_id==StrCardId2CardVars[0])
                {
                    blnCardId2CardVarsCheck = true;
                    break;
                }
            }
            
            if(!blnCardId2CardVarsCheck)
            {                
                SQL = String.Format(“SELECT card_code,display,pin,apb_level_value FROM card WHERE id='{0}’ LIMIT 0,1;”, Strcard_id);//授權呼叫SQL的維度降低-把所有單一SELECT語法加上LIMIT 0,1 
                FileLib.logFile(“HW_SQL_track.log”, SQL + “-8-” + DateTime.Now.ToString(“HHmmss”));//增加HW_SQL_track.log功能,為了簡化SQL查詢做準備
                Reader_Data = MySQL.GetDataReader(SQL);
                Reader_Data.Read();
                Strcard_code = Reader_Data[“card_code”].ToString();
                Strcard_display = Reader_Data[“display”].ToString();
                Strcard_pin_code = Reader_Data[“pin”].ToString();
                Strcard_apb_level_value = Reader_Data[“apb_level_value”].ToString();
                Strcard_valid_start = “”;
                Strcard_valid_endle = “”;
                Strcard_apb_apb_enabled = “”;
                Reader_Data.Close();
                Reader_Data = null;
                AL_CardId2CardVarsAll.Add(Strcard_id + “,” + Strcard_code + “,” + Strcard_display + “,” + Strcard_pin_code + “,” + Strcard_apb_level_value);
            }
            else
            {
                Strcard_code = StrCardId2CardVars[1];
                Strcard_display = StrCardId2CardVars[2];
                Strcard_pin_code = StrCardId2CardVars[3];
                Strcard_apb_level_value = StrCardId2CardVars[4];
                Strcard_valid_start = “”;
                Strcard_valid_endle = “”;
                Strcard_apb_apb_enabled = “”;                    
            }
            //—授權呼叫SQL的維度降低-把card、door和控制器查詢的動作存放在記憶體中,當要再查時先找記憶體
            //–
        }
        else
        {
            Reader_Data.Close();
            Reader_Data = null;
            blnloop = false;//沒有資料要傳送,直接離開
        }
        //—

    } while (blnloop);

    String StrAns = “”;
    String StrTxtData = “”;//修正傳送授權內容到紀錄文字檔符合SYDM/SYCG兩種模式
    bool blncheck = false;
    if (blnDeleteCard == true)
    {
        //執行刪卡
        //—
        //SYDM和SYCG API呼叫並存實現
        if (!Main_Frm.pForm1.m_changeSYCGMode)//SYDM
        {
            StrAns = parseJSON.composeJSONCControllerDelAuthorization(DelSendAnsData);
            blncheck = HW_Net_API.delControllerAuthorization(StrAns);//SYDM控制器授權API呼叫
            StrTxtData = StrAns;//修正傳送授權內容到紀錄文字檔符合SYDM/SYCG兩種模式
            if (!blncheck)
            {
                StrTxtData = StrTxtData + “-ERROR\n”;//原本設計如果傳送授權失敗不記錄傳送內容,現在要改成都要記錄下來授權的JSON,錯誤的在後面加上-ERROR
            }
        }
        else//SYCG
        {
            ControllerDelAuthorization SYCG_DelSendAnsData = new ControllerDelAuthorization();//實際傳送變數值
            //—
            //把相同SYDM的授權命令集合一次傳送 ~ 依照SYDM進行授權資料分類+實際傳送 
            /*
            for (int l = 0; l < DelSendAnsData.authorizations.Count; l++)
            {
                SYCG_DelSendAnsData.authorizations.Clear();
                SYCG_DelSendAnsData.authorizations.Add(DelSendAnsData.authorizations[l]);
                StrAns = parseJSON.composeJSONCControllerDelAuthorization(SYCG_DelSendAnsData);
                blncheck = HW_Net_API.SYCG_callSYDMCommand(“SYDM_DELETE_CONTROLLER_AUTHORIZATION”, StrAns, (String)AL_sydm_id[l]);
                if (!blncheck)
                {
                    StrTxtData = StrTxtData + StrAns + “-ERROR\n”;//原本設計如果傳送授權失敗不記錄傳送內容,現在要改成都要記錄下來授權的JSON,錯誤的在後面加上-ERROR
                    //授權時改成就算有錯也要每一筆都傳- break;
                }
                else
                {
                    StrTxtData = StrTxtData + StrAns + “\n”;//修正傳送授權內容到紀錄文字檔符合SYDM/SYCG兩種模式
                }
            }//for (int l = 0; l < DelSendAnsData.authorizations.Count; l++)
            */
            for (int l = 0; l < AL_sydmAll.Count; l++)
            {
                String[] Strchecksydm = AL_sydmAll[l].ToString().Split(‘,’);
                SYCG_DelSendAnsData.authorizations.Clear();
                for (int m = 0; m < DelSendAnsData.authorizations.Count; m++)
                {
                    if (Strchecksydm[0] == (String)AL_sydm_id[m])
                    {
                        SYCG_DelSendAnsData.authorizations.Add(DelSendAnsData.authorizations[m]);
                    }
                }//for (int m = 0; m < DelSendAnsData.authorizations.Count; m++)
                if (SYCG_DelSendAnsData.authorizations.Count > 0)
                {
                    StrAns = parseJSON.composeJSONCControllerDelAuthorization(SYCG_DelSendAnsData);
                    blncheck = HW_Net_API.SYCG_callSYDMCommand(“SYDM_DELETE_CONTROLLER_AUTHORIZATION”, StrAns, Strchecksydm[1]);
                    if (!blncheck)
                    {
                        StrTxtData = StrTxtData + StrAns + “-ERROR\n”;//原本設計如果傳送授權失敗不記錄傳送內容,現在要改成都要記錄下來授權的JSON,錯誤的在後面加上-ERROR
                        //授權時改成就算有錯也要每一筆都傳- break;
                    }
                    else
                    {
                        StrTxtData = StrTxtData + StrAns + “\n”;//修正傳送授權內容到紀錄文字檔符合SYDM/SYCG兩種模式
                    }
                }//if (SYCG_DelSendAnsData.authorizations.Count > 0)
            }//for (int l = 0; l < AL_sydmAll.Count; l++)
            //—把相同SYDM的授權命令集合一次傳送 ~ 依照SYDM進行授權資料分類+實際傳送 
        }
        //—SYDM和SYCG API呼叫並存實現

    }
    else
    {
        //執行傳卡
        //—
        //SYDM和SYCG API呼叫並存實現
        if (!Main_Frm.pForm1.m_changeSYCGMode)//SYDM
        {
            StrAns = parseJSON.composeJSONControllerAuthorization(SendAnsData);
            blncheck = HW_Net_API.addControllerAuthorization(StrAns);//SYDM控制器授權API呼叫
            StrTxtData = StrAns;//修正傳送授權內容到紀錄文字檔符合SYDM/SYCG兩種模式
            if (!blncheck)
            {
                StrTxtData = StrTxtData + “-ERROR\n”;//原本設計如果傳送授權失敗不記錄傳送內容,現在要改成都要記錄下來授權的JSON,錯誤的在後面加上-ERROR
            }
        }
        else//SYCG
        {
            ControllerAuthorization SYCG_SendAnsData = new ControllerAuthorization();//實際傳送變數值
            //—
            //把相同SYDM的授權命令集合一次傳送 ~ 依照SYDM進行授權資料分類+實際傳送 
            /*
            for (int l = 0; l < SendAnsData.authorizations.Count; l++)
            {
                SYCG_SendAnsData.authorizations.Clear();
                SYCG_SendAnsData.authorizations.Add(SendAnsData.authorizations[l]);
                StrAns = parseJSON.composeJSONControllerAuthorization(SYCG_SendAnsData);
                blncheck = HW_Net_API.SYCG_callSYDMCommand(“SYDM_ADD_CONTROLLER_AUTHORIZATION”, StrAns, (String)AL_sydm_id[l]);
                if (!blncheck)
                {
                    StrTxtData = StrTxtData + StrAns + “-ERROR\n”;//原本設計如果傳送授權失敗不記錄傳送內容,現在要改成都要記錄下來授權的JSON,錯誤的在後面加上-ERROR
                    //授權時改成就算有錯也要每一筆都傳- break;
                }
                else
                {
                    StrTxtData = StrTxtData + StrAns + “\n”;//修正傳送授權內容到紀錄文字檔符合SYDM/SYCG兩種模式
                }
            }//for (int l = 0; l < SendAnsData.authorizations.Count; l++)
            */
            for (int l = 0; l < AL_sydmAll.Count; l++)
            {
                String[] Strchecksydm = AL_sydmAll[l].ToString().Split(‘,’);
                SYCG_SendAnsData.authorizations.Clear();
                for (int m = 0; m < SendAnsData.authorizations.Count; m++)
                {
                    if (Strchecksydm[0] == (String)AL_sydm_id[m])
                    {
                        SYCG_SendAnsData.authorizations.Add(SendAnsData.authorizations[m]);
                    }
                }//for (int m = 0; m < SendAnsData.authorizations.Count; m++)
                if (SYCG_SendAnsData.authorizations.Count > 0)
                {
                    StrAns = parseJSON.composeJSONControllerAuthorization(SYCG_SendAnsData);
                    blncheck = HW_Net_API.SYCG_callSYDMCommand(“SYDM_ADD_CONTROLLER_AUTHORIZATION”, StrAns, Strchecksydm[1]);
                    if (!blncheck)
                    {
                        StrTxtData = StrTxtData + StrAns + “-ERROR\n”;//原本設計如果傳送授權失敗不記錄傳送內容,現在要改成都要記錄下來授權的JSON,錯誤的在後面加上-ERROR
                        //授權時改成就算有錯也要每一筆都傳- break;
                    }
                    else
                    {
                        StrTxtData = StrTxtData + StrAns + “\n”;//修正傳送授權內容到紀錄文字檔符合SYDM/SYCG兩種模式
                    }
                }//if (SYCG_SendAnsData.authorizations.Count > 0)
            }//for (int l = 0; l < AL_sydmAll.Count; l++)
            //—把相同SYDM的授權命令集合一次傳送 ~ 依照SYDM進行授權資料分類+實際傳送 
        }
        //—SYDM和SYCG API呼叫並存實現
    }

    //—
    //修正DB派送授權的紀錄狀態語法讓DB支援派送失敗也可復原狀態值
    if (blncheck)//傳送成功
    {
        SQL = “DELETE FROM authorization_data WHERE state = ‘-100’;”;
        FileLib.logFile(“HW_SQL_track.log”, SQL + “-10-” + DateTime.Now.ToString(“HHmmss”));//增加HW_SQL_track.log功能,為了簡化SQL查詢做準備
        MySQL.InsertUpdateDelete(SQL);
        SQL = “UPDATE authorization_data SET state = ‘0’ WHERE state = ‘100’;”;
        FileLib.logFile(“HW_SQL_track.log”, SQL + “-11-” + DateTime.Now.ToString(“HHmmss”));//增加HW_SQL_track.log功能,為了簡化SQL查詢做準備
        MySQL.InsertUpdateDelete(SQL);
    }
    else//傳送失敗
    {
        SQL = “UPDATE authorization_data SET state = ‘-1’ WHERE state = ‘-100’;”;
        FileLib.logFile(“HW_SQL_track.log”, SQL + “-12-” + DateTime.Now.ToString(“HHmmss”));//增加HW_SQL_track.log功能,為了簡化SQL查詢做準備
        MySQL.InsertUpdateDelete(SQL);
        SQL = “UPDATE authorization_data SET state = ‘1’ WHERE state = ‘100’;”;
        FileLib.logFile(“HW_SQL_track.log”, SQL + “-13-” + DateTime.Now.ToString(“HHmmss”));//增加HW_SQL_track.log功能,為了簡化SQL查詢做準備
        MySQL.InsertUpdateDelete(SQL);
    }
    //—

    FileLib.TxtFile(“authorization_data.txt”, StrTxtData);//修正傳送授權內容到紀錄文字檔符合SYDM/SYCG兩種模式- FileLib.TxtFile(“authorization_data.txt”, StrAns);//授權JSON字串存檔(紀錄最後一次)
}//public static void sendData2HW()
//—建立傳送授權參數函數

//—
//建立傳送授權參數函數_V0201
public static void sendData2HW_20180531()
{
    bool blnloop = false;
    String SQL = “”;
    String Strcard_id = “”;
    //–
    //sendData2HW()中增加抓取卡片內碼+卡片display+卡片pin_code+卡片效期+卡片APB
    String Strcard_code = “”;
    String Strcard_display = “”;
    String Strcard_pin_code = “”;
    String Strcard_valid_start = “”;
    String Strcard_valid_endle = “”;
    String Strcard_apb_level_value = “”;
    String Strcard_apb_apb_enabled = “”;

    //–
    String Strdoor_id = “”;

    String Strcontroller_model = “”;//控制器型態
    String Strcontroller_sn = “”;
    String Strcontroller_IP = “”;
    String Strcontroller_Port = “”;//增加sendData2HW()中controller_Port的抓取-呼叫Getsy_dm_Controller_id需要使用
    String Strconnetction_mode = “”;//控制器連線模式
    //—
    //新增一個ArrayList紀錄CONTROLLER的SYDM ID
    String Strsydm_id = “”;
    ArrayList AL_sydm_id = new ArrayList();
    AL_sydm_id.Clear();
    //—新增一個ArrayList紀錄CONTROLLER的SYDM ID

    ArrayList AL_AllDoorid = new ArrayList();//記錄同控制器下的門ID
    ArrayList AL_AnsData = new ArrayList();//存放所有授權資料

    bool blnDeleteCard = true;
    ControllerAuthorization SendAnsData = new ControllerAuthorization();//實際傳送變數值
    SendAnsData.authorizations.Clear();
    Authorization AnsAuthorization = new Authorization();//實際傳送變數值
    ControllerDelAuthorization DelSendAnsData = new ControllerDelAuthorization();//實際傳送變數值
    DelSendAnsData.authorizations.Clear();
    DelAuthorization DelAuthorization = new DelAuthorization();//實際傳送變數值

    //—
    //把相同SYDM的授權命令集合一次傳送 ~ 查詢系統目前所有SYDM
    ArrayList AL_sydmAll = new ArrayList();
    AL_sydmAll.Clear();
    MySqlDataReader ReaderSydmAll = MySQL.GetDataReader(“SELECT id,identifier FROM sydm;”);
    while (ReaderSydmAll.Read())
    {
        AL_sydmAll.Add(ReaderSydmAll[“id”].ToString() + “,” + ReaderSydmAll[“identifier”].ToString());//DB用id關聯,API用identifier操作
    }
    ReaderSydmAll.Close();
    //—把相同SYDM的授權命令集合一次傳送 ~ 查詢系統目前所有SYDM

    //—
    //修改授權時呼叫SYDM_GET_CONTROLLER_CONNECTION API位置,為了減少呼叫該API次數
    //—
    //SYDM和SYCG API呼叫並存實現
    if (!Main_Frm.pForm1.m_changeSYCGMode)//SYDM
    {
        Main_Frm.pForm1.m_blnAPI = HW_Net_API.getController_Connection();
    }
    else//SYCG
    {
        Main_Frm.pForm1.m_blnAPI = HW_Net_API.SYCG_getSYDMList();
        if (Main_Frm.pForm1.m_blnAPI)
        {
            HW_Net_API.m_Controller_Connection.controllers.Clear();
            for (int l = 0; l < Main_Frm.m_Sydms.sydms.Count; l++)
            {
                HW_Net_API.SYCG_callSYDMCommand(“SYDM_GET_CONTROLLER_CONNECTION”, “”, Main_Frm.m_Sydms.sydms[l].identifier.ToString());
            }
        }
    }
    //—SYDM和SYCG API呼叫並存實現
    //—修改授權時呼叫SYDM_GET_CONTROLLER_CONNECTION API位置,為了減少呼叫該API次數

    //判斷是否還有未傳送的授權資料    ~   SELECT * FROM  authorization_data WHERE state <> 0;
    //找出 第一筆狀態>0 的資料,並找出對應控制器
    //—
    //實作傳送授權參數函數-10%
    SQL = “SELECT * FROM  authorization_data WHERE (state=1 OR state=-1);”;//修改sendData2HW()中搜尋還未派送的授權資料-SQL = String.Format(“SELECT * FROM  authorization_data WHERE state <> ‘{0}’;”, 0);
    FileLib.logFile(“HW_SQL_track.log”, SQL + “-1-” + DateTime.Now.ToString(“HHmmss”));//增加HW_SQL_track.log功能,為了簡化SQL查詢做準備
    MySqlDataReader Reader_Data = MySQL.GetDataReader(SQL);
    if (Reader_Data.HasRows == true)
    {
        blnloop = Reader_Data.HasRows;
        Reader_Data.Read();
        Strcard_id = Reader_Data[“card_id”].ToString();
        Strdoor_id = Reader_Data[“door_id”].ToString();
        Reader_Data.Close();
        Reader_Data = null;
        //–
        //sendData2HW()中增加抓取卡片內碼+卡片display+卡片pin_code+卡片效期+卡片APB
        Strcard_code = “”;
        SQL = String.Format(“SELECT card_code,display,pin,apb_level_value FROM card WHERE id='{0}’;”, Strcard_id);
        FileLib.logFile(“HW_SQL_track.log”, SQL + “-2-” + DateTime.Now.ToString(“HHmmss”));//增加HW_SQL_track.log功能,為了簡化SQL查詢做準備
        Reader_Data = MySQL.GetDataReader(SQL);
        Reader_Data.Read();
        Strcard_code = Reader_Data[“card_code”].ToString();
        Strcard_display = Reader_Data[“display”].ToString();
        Strcard_pin_code = Reader_Data[“pin”].ToString();
        Strcard_apb_level_value = Reader_Data[“apb_level_value”].ToString();
        Strcard_valid_start = “”;
        Strcard_valid_endle = “”;
        Strcard_apb_apb_enabled = “”;
        Reader_Data.Close();
        Reader_Data = null;
        //–
    }
    else
    {
        Reader_Data.Close();
        Reader_Data = null;
        return;//沒有資料要傳送,直接離開
    }
    //—

    do
    {
        //紀錄對應控制器門數 和 型態    ~   SELECT c.model AS model,c.sn AS sn,ce.connetction_address AS IP,ce.connetction_mode AS connetction_mode FROM door AS d,controller AS c,controller_extend AS ce WHERE (c.sn=ce.controller_sn) AND (c.sn=d.controller_id) AND (d.id='{0}’); Strdoor_id
        //—
        //實作傳送授權參數函數-20%
        SQL = String.Format(“SELECT c.sydm_id AS sydm_id,c.model AS model,c.sn AS sn,ce.port AS port,ce.connetction_address AS IP,ce.connetction_mode AS connetction_mode FROM door AS d,controller AS c,controller_extend AS ce WHERE (c.sn=ce.controller_sn) AND (c.sn=d.controller_id) AND (d.id='{0}’);”, Strdoor_id);//增加sendData2HW()中controller_Port的抓取-呼叫Getsy_dm_Controller_id需要使用 ~ SQL = String.Format(“SELECT c.model AS model,c.sn AS sn,ce.connetction_address AS IP,ce.connetction_mode AS connetction_mode FROM door AS d,controller AS c,controller_extend AS ce WHERE (c.sn=ce.controller_sn) AND (c.sn=d.controller_id) AND (d.id='{0}’);”, Strdoor_id);
        FileLib.logFile(“HW_SQL_track.log”, SQL + “-3-” + DateTime.Now.ToString(“HHmmss”));//增加HW_SQL_track.log功能,為了簡化SQL查詢做準備
        Reader_Data = MySQL.GetDataReader(SQL);
        while (Reader_Data.Read())
        {
            Strcontroller_model = Reader_Data[“model”].ToString(); ;//控制器型態
            Strcontroller_sn = Reader_Data[“sn”].ToString(); ;
            Strcontroller_IP = Reader_Data[“IP”].ToString(); ;
            Strcontroller_Port = Reader_Data[“port”].ToString();//增加sendData2HW()中controller_Port的抓取-呼叫Getsy_dm_Controller_id需要使用
            Strconnetction_mode = Reader_Data[“connetction_mode”].ToString();//控制器連線模式

            //—
            //新增一個ArrayList紀錄CONTROLLER的SYDM ID
            Strsydm_id = Reader_Data[“sydm_id”].ToString();
            AL_sydm_id.Add(Strsydm_id);
            //—新增一個ArrayList紀錄CONTROLLER的SYDM ID

            break;
        }
        Reader_Data.Close();
        Reader_Data = null;
        //—

        //找出該控制器下所有門且同一張卡的全部授權資料記錄在ArrayList中
        //  AL_AllDoorid    ~   SELECT id FROM door WHERE controller_id='{0}’; Strcontroller_sn
        //  AL_AnsData      ~   SELECT * FROM  authorization_data WHERE (card_id='{0}’) AND (door_id='{1}’); Strcard_id AL_AllDoorid
        //—
        //實作傳送授權參數函數-30%
        AL_AllDoorid.Clear();
        SQL = String.Format(“SELECT id FROM door WHERE controller_id='{0}’;”, Strcontroller_sn);
        FileLib.logFile(“HW_SQL_track.log”, SQL + “-4-” + DateTime.Now.ToString(“HHmmss”));//增加HW_SQL_track.log功能,為了簡化SQL查詢做準備
        Reader_Data = MySQL.GetDataReader(SQL);
        while (Reader_Data.Read())
        {
            AL_AllDoorid.Add(Reader_Data[“id”].ToString());
        }
        Reader_Data.Close();
        Reader_Data = null;

        AL_AnsData.Clear();
        for (int i = 0; i < AL_AllDoorid.Count; i++)
        {
            SQL = String.Format(“SELECT * FROM  authorization_data WHERE (card_id='{0}’) AND (door_id='{1}’);”, Strcard_id, AL_AllDoorid[i]);
            FileLib.logFile(“HW_SQL_track.log”, SQL + “-5-” + DateTime.Now.ToString(“HHmmss”));//增加HW_SQL_track.log功能,為了簡化SQL查詢做準備
            Reader_Data = MySQL.GetDataReader(SQL);
            while (Reader_Data.Read())
            {

                /*
                CREATE TABLE IF NOT EXISTS `authorization_data` (
                  `card_id` int(11) NOT NULL,
                  `door_id` int(11) NOT NULL,
                  `type` int(11) NOT NULL DEFAULT ‘0’,
                  `block` varchar(10) NOT NULL DEFAULT ‘0,0,0’,
                  `level` int(11) NOT NULL DEFAULT ‘1’,
                  `access_time_1_start` time NOT NULL DEFAULT ’00:00:00′,
                  `access_time_1_end` time NOT NULL DEFAULT ’23:59:00′,
                  `access_time_2_start` time NOT NULL DEFAULT ’00:00:00′,
                  `access_time_2_end` time NOT NULL DEFAULT ’00:00:00′,
                  `access_time_3_start` time NOT NULL DEFAULT ’00:00:00′,
                  `access_time_3_end` time NOT NULL DEFAULT ’00:00:00′,
                  `week_plan` int(11) NOT NULL DEFAULT ‘0’,
                  `available_date_start` varchar(25) NOT NULL DEFAULT ‘now’,
                  `available_date_end` varchar(25) NOT NULL DEFAULT ‘forever’,
                  `state` int(11) NOT NULL DEFAULT ‘0’ COMMENT ‘[-1]->del,[0]->finish,[1]->send’,
                  PRIMARY KEY (`card_id`,`door_id`)
                ) ENGINE=MyISAM DEFAULT CHARSET=utf8;                          
                */
                AnsData AnsData00 = new AnsData();
                AnsData00.Strcard_id = Reader_Data[“card_id”].ToString();
                AnsData00.Strdoor_id = Reader_Data[“door_id”].ToString();
                AnsData00.Strtype = Reader_Data[“type”].ToString();
                AnsData00.Strblock = Reader_Data[“block”].ToString();
                AnsData00.Strlevel = Reader_Data[“level”].ToString();
                AnsData00.Straccess_time_1_start = Reader_Data[“access_time_1_start”].ToString();
                AnsData00.Straccess_time_1_end = Reader_Data[“access_time_1_end”].ToString();
                AnsData00.Straccess_time_2_start = Reader_Data[“access_time_2_start”].ToString();
                AnsData00.Straccess_time_2_end = Reader_Data[“access_time_2_end”].ToString();
                AnsData00.Straccess_time_3_start = Reader_Data[“access_time_3_start”].ToString();
                AnsData00.Straccess_time_3_end = Reader_Data[“access_time_3_end”].ToString();
                AnsData00.Strweek_plan = Reader_Data[“week_plan”].ToString();
                AnsData00.Stravailable_date_start = Reader_Data[“available_date_start”].ToString();
                AnsData00.Stravailable_date_end = Reader_Data[“available_date_end”].ToString();
                AnsData00.state = Convert.ToInt32(Reader_Data[“state”].ToString());//加刪旗標(-1,0,1)刪,預設,加
                AnsData00.flag = 0;
                AL_AnsData.Add(AnsData00);

            }//while (Reader_Data.Read())
            Reader_Data.Close();
            Reader_Data = null;
        }//for (int i = 0; i < AL_AllDoorid.Count; i++)
        //—

        //按照控制器型態和門數 組合(state>0)出正確的傳送參數 並傳送
        //SELECT controller_door_index FROM door WHERE id='{0}’; 
        //—
        //實作傳送授權參數函數-40%
        int[] doorstate = null;//紀錄同一控制器開門狀態
        //–
        //sendData2HW()中增加計算那些門或那些樓層可通行的flag
        int door_accessable_flags = 0;
        int[] floor_flags_list = new int[16];
        for (int l = 0; l < floor_flags_list.Length; l++)
        {
            floor_flags_list[l] = 0;
        }
        //–

        AuthorizedConfigurationList[] AnsAuthorizedConfigurationList = null;//sendData2HW()中增加門參整合用變數

        switch (Convert.ToInt32(Strcontroller_model))
        {
            case 1://單門模式
                doorstate = new int[1];
                //–
                //sendData2HW()中增加門參整合用變數
                AnsAuthorizedConfigurationList = new AuthorizedConfigurationList[1];
                AnsAuthorizedConfigurationList[0] = new AuthorizedConfigurationList();
                //–
                break;
            case 2://4門模式
                doorstate = new int[4];
                //–
                //sendData2HW()中增加門參整合用變數
                AnsAuthorizedConfigurationList = new AuthorizedConfigurationList[4];
                for (int l = 0; l < 4; l++)
                {
                    AnsAuthorizedConfigurationList[l] = new AuthorizedConfigurationList();
                }
                //–
                break;
            case 3://4門強制配對模式
                doorstate = new int[4];
                //–
                //sendData2HW()中增加門參整合用變數
                AnsAuthorizedConfigurationList = new AuthorizedConfigurationList[4];
                for (int l = 0; l < 4; l++)
                {
                    AnsAuthorizedConfigurationList[l] = new AuthorizedConfigurationList();
                }
                //–
                break;
            case 4://12門模式
                doorstate = new int[12];
                //–
                //sendData2HW()中增加門參整合用變數
                AnsAuthorizedConfigurationList = new AuthorizedConfigurationList[1];
                AnsAuthorizedConfigurationList[0] = new AuthorizedConfigurationList();
                //–
                break;
            case 5://電梯/儲物櫃模式
                doorstate = new int[128];
                //–
                //sendData2HW()中增加門參整合用變數
                AnsAuthorizedConfigurationList = new AuthorizedConfigurationList[1];
                AnsAuthorizedConfigurationList[0] = new AuthorizedConfigurationList();
                //–
                break;
        }
        for (int i = 0; i < doorstate.Length; i++)
        {
            doorstate[i] = 0;
        }

        CalculatePassTime buf_CalculatePassTime = new CalculatePassTime();//把資料從『門(N個)VS卡』-> 『控(1個)VS卡』,合併通行時段變數
        for (int i = 0; i < AL_AnsData.Count; i++)
        {
            Strcard_valid_start = ((AnsData)AL_AnsData[i]).Stravailable_date_start;
            Strcard_valid_endle = ((AnsData)AL_AnsData[i]).Stravailable_date_end;

            int controller_door_index = 0;
            SQL = String.Format(“SELECT controller_door_index FROM door WHERE id='{0}’;”, ((AnsData)AL_AnsData[i]).Strdoor_id);
            FileLib.logFile(“HW_SQL_track.log”, SQL + “-6-” + DateTime.Now.ToString(“HHmmss”));//增加HW_SQL_track.log功能,為了簡化SQL查詢做準備
            Reader_Data = MySQL.GetDataReader(SQL);
            while (Reader_Data.Read())
            {
                controller_door_index = Convert.ToInt32(Reader_Data[“controller_door_index”].ToString());
                break;
            }
            Reader_Data.Close();
            Reader_Data = null;
            if (((AnsData)AL_AnsData[i]).state >= 0)
            {
                doorstate[controller_door_index – 1] = 1;//該控制器的第 controller_door_index 門可通行

                //–
                //sendData2HW()中增加計算那些門或那些樓層可通行的flag
                if (Convert.ToInt32(Strcontroller_model) != 5)//非電梯
                {
                    door_accessable_flags += (int)Math.Pow(2, (controller_door_index – 1));
                }
                else//電梯
                {
                    /*
                    128 064 032 016 008 004 002 001
                    ——————————-
                    7   6   5   4   3   2   1   0
                    15  14  13  12  11  10  9   8
                    23  22  21  20  19  18  17  16
                            
                    X=6,13 –> X=(controller_door_index – 1)
                    X<8*(l+1) –>l 就是組別
                    2^{8-[8*(l+1) – X]} –> value
                    */
                    int l = 1;
                    do
                    {
                        if ((l * 8) > (controller_door_index – 1))
                        {
                            int k = 8 – ((l * 8) – (controller_door_index – 1));
                            floor_flags_list[(l – 1)] += (int)Math.Pow(2, k);
                            break;
                        }
                        l++;
                    } while (l <= 16);
                }
                //–

            }
            else
            {
                doorstate[controller_door_index – 1] = 0;//該控制器的第 controller_door_index 門不可通行
            }

            //–
            //把資料從『門(N個)VS卡』-> 『控(1個)VS卡』
            /*
            單門,12門,電梯 ->合併一份門參
            4門 -> 4份門參
            */
            if ((Convert.ToInt32(Strcontroller_model) == 2) || (Convert.ToInt32(Strcontroller_model) == 3))//4門 -> 4份門參
            {
                string[] strs00 = ((AnsData)AL_AnsData[i]).Strblock.Split(‘,’);
                if (Convert.ToInt32(strs00[2]) == 0)
                {
                    Strcard_apb_apb_enabled = “1”;
                }
                else
                {
                    Strcard_apb_apb_enabled = “0”;
                }
                AnsAuthorizedConfigurationList[controller_door_index – 1].card_disabled = Convert.ToInt32(strs00[0]);
                AnsAuthorizedConfigurationList[controller_door_index – 1].card_in_black = Convert.ToInt32(strs00[1]);
                AnsAuthorizedConfigurationList[controller_door_index – 1].card_level = Convert.ToInt32(((AnsData)AL_AnsData[i]).Strlevel);
                AnsAuthorizedConfigurationList[controller_door_index – 1].card_type = Convert.ToInt32(((AnsData)AL_AnsData[i]).Strtype);

                TimeRangeList bufTimeRangeList01 = new TimeRangeList();
                TimeRangeList bufTimeRangeList02 = new TimeRangeList();
                TimeRangeList bufTimeRangeList03 = new TimeRangeList();
                string[] strs01 = ((AnsData)AL_AnsData[i]).Straccess_time_1_start.Split(‘:’);
                string[] strs02 = ((AnsData)AL_AnsData[i]).Straccess_time_1_end.Split(‘:’);
                bufTimeRangeList01.start_timestamp = Convert.ToInt32(strs01[0]) * 3600 + Convert.ToInt32(strs01[1]) * 60 + Convert.ToInt32(strs01[2]);
                bufTimeRangeList01.endle_timestamp = Convert.ToInt32(strs02[0]) * 3600 + Convert.ToInt32(strs02[1]) * 60 + Convert.ToInt32(strs02[2]);
                AnsAuthorizedConfigurationList[controller_door_index – 1].time_range_list.Add(bufTimeRangeList01);

                string[] strs03 = ((AnsData)AL_AnsData[i]).Straccess_time_2_start.Split(‘:’);
                string[] strs04 = ((AnsData)AL_AnsData[i]).Straccess_time_2_end.Split(‘:’);
                bufTimeRangeList02.start_timestamp = Convert.ToInt32(strs03[0]) * 3600 + Convert.ToInt32(strs03[1]) * 60 + Convert.ToInt32(strs03[2]);
                bufTimeRangeList02.endle_timestamp = Convert.ToInt32(strs04[0]) * 3600 + Convert.ToInt32(strs04[1]) * 60 + Convert.ToInt32(strs04[2]);
                AnsAuthorizedConfigurationList[controller_door_index – 1].time_range_list.Add(bufTimeRangeList02);

                string[] strs05 = ((AnsData)AL_AnsData[i]).Straccess_time_3_start.Split(‘:’);
                string[] strs06 = ((AnsData)AL_AnsData[i]).Straccess_time_3_end.Split(‘:’);
                bufTimeRangeList03.start_timestamp = Convert.ToInt32(strs05[0]) * 3600 + Convert.ToInt32(strs05[1]) * 60 + Convert.ToInt32(strs05[2]);
                bufTimeRangeList03.endle_timestamp = Convert.ToInt32(strs06[0]) * 3600 + Convert.ToInt32(strs06[1]) * 60 + Convert.ToInt32(strs06[2]);
                AnsAuthorizedConfigurationList[controller_door_index – 1].time_range_list.Add(bufTimeRangeList03);

                AnsAuthorizedConfigurationList[controller_door_index – 1].week_plan_flags = Convert.ToInt32(((AnsData)AL_AnsData[i]).Strweek_plan);
            }
            else//單門,12門,電梯 ->合併一份門參
            {
                string[] strs00 = ((AnsData)AL_AnsData[i]).Strblock.Split(‘,’);
                if (Convert.ToInt32(strs00[2]) == 0)
                {
                    Strcard_apb_apb_enabled = “1”;
                }
                else
                {
                    Strcard_apb_apb_enabled = “0”;
                }
                if (AnsAuthorizedConfigurationList[0].card_disabled < Convert.ToInt32(strs00[0]))
                {
                    AnsAuthorizedConfigurationList[0].card_disabled = Convert.ToInt32(strs00[0]);
                }
                if (AnsAuthorizedConfigurationList[0].card_in_black < Convert.ToInt32(strs00[1]))
                {
                    AnsAuthorizedConfigurationList[0].card_in_black = Convert.ToInt32(strs00[1]);
                }

                if (AnsAuthorizedConfigurationList[0].card_level < Convert.ToInt32(((AnsData)AL_AnsData[i]).Strlevel))
                {
                    AnsAuthorizedConfigurationList[0].card_level = Convert.ToInt32(((AnsData)AL_AnsData[i]).Strlevel);
                }

                if (AnsAuthorizedConfigurationList[0].card_type < Convert.ToInt32(((AnsData)AL_AnsData[i]).Strtype))
                {
                    AnsAuthorizedConfigurationList[0].card_type = Convert.ToInt32(((AnsData)AL_AnsData[i]).Strtype);
                }

                if (AnsAuthorizedConfigurationList[0].week_plan_flags < Convert.ToInt32(((AnsData)AL_AnsData[i]).Strweek_plan))
                {
                    AnsAuthorizedConfigurationList[0].week_plan_flags = Convert.ToInt32(((AnsData)AL_AnsData[i]).Strweek_plan);
                }

                AnsAuthorizedConfigurationList[0].time_range_list.Clear();
                buf_CalculatePassTime.SetInput(((AnsData)AL_AnsData[i]).Straccess_time_1_start, ((AnsData)AL_AnsData[i]).Straccess_time_1_end, true);
                buf_CalculatePassTime.SetInput(((AnsData)AL_AnsData[i]).Straccess_time_2_start, ((AnsData)AL_AnsData[i]).Straccess_time_2_end, true);
                buf_CalculatePassTime.SetInput(((AnsData)AL_AnsData[i]).Straccess_time_3_start, ((AnsData)AL_AnsData[i]).Straccess_time_3_end, true);
                TimeRangeList bufTimeRangeList01 = new TimeRangeList();
                TimeRangeList bufTimeRangeList02 = new TimeRangeList();
                TimeRangeList bufTimeRangeList03 = new TimeRangeList();
                int count = buf_CalculatePassTime.CalOutput();
                switch (count)
                {
                    case 1:
                        string[] strs01 = buf_CalculatePassTime.m_StrS1.Split(‘:’);
                        string[] strs02 = buf_CalculatePassTime.m_StrE1.Split(‘:’);
                        string[] strs03 = “00:00”.Split(‘:’);
                        string[] strs04 = “00:00”.Split(‘:’);
                        string[] strs05 = “00:00”.Split(‘:’);
                        string[] strs06 = “00:00”.Split(‘:’);
                        bufTimeRangeList01.start_timestamp = Convert.ToInt32(strs01[0]) * 3600 + Convert.ToInt32(strs01[1]) * 60;
                        bufTimeRangeList01.endle_timestamp = Convert.ToInt32(strs02[0]) * 3600 + Convert.ToInt32(strs02[1]) * 60;
                        AnsAuthorizedConfigurationList[0].time_range_list.Add(bufTimeRangeList01);
                        bufTimeRangeList02.start_timestamp = Convert.ToInt32(strs03[0]) * 3600 + Convert.ToInt32(strs03[1]) * 60;
                        bufTimeRangeList02.endle_timestamp = Convert.ToInt32(strs04[0]) * 3600 + Convert.ToInt32(strs04[1]) * 60;
                        AnsAuthorizedConfigurationList[0].time_range_list.Add(bufTimeRangeList02);
                        bufTimeRangeList03.start_timestamp = Convert.ToInt32(strs05[0]) * 3600 + Convert.ToInt32(strs05[1]) * 60;
                        bufTimeRangeList03.endle_timestamp = Convert.ToInt32(strs06[0]) * 3600 + Convert.ToInt32(strs06[1]) * 60;
                        AnsAuthorizedConfigurationList[0].time_range_list.Add(bufTimeRangeList03);
                        break;
                    case 2:
                        string[] strs07 = buf_CalculatePassTime.m_StrS1.Split(‘:’);
                        string[] strs08 = buf_CalculatePassTime.m_StrE1.Split(‘:’);
                        string[] strs09 = buf_CalculatePassTime.m_StrS2.Split(‘:’);
                        string[] strs10 = buf_CalculatePassTime.m_StrE2.Split(‘:’);
                        string[] strs11 = “00:00”.Split(‘:’);
                        string[] strs12 = “00:00”.Split(‘:’);
                        bufTimeRangeList01.start_timestamp = Convert.ToInt32(strs07[0]) * 3600 + Convert.ToInt32(strs07[1]) * 60;
                        bufTimeRangeList01.endle_timestamp = Convert.ToInt32(strs08[0]) * 3600 + Convert.ToInt32(strs08[1]) * 60;
                        AnsAuthorizedConfigurationList[0].time_range_list.Add(bufTimeRangeList01);
                        bufTimeRangeList02.start_timestamp = Convert.ToInt32(strs09[0]) * 3600 + Convert.ToInt32(strs09[1]) * 60;
                        bufTimeRangeList02.endle_timestamp = Convert.ToInt32(strs10[0]) * 3600 + Convert.ToInt32(strs10[1]) * 60;
                        AnsAuthorizedConfigurationList[0].time_range_list.Add(bufTimeRangeList02);
                        bufTimeRangeList03.start_timestamp = Convert.ToInt32(strs11[0]) * 3600 + Convert.ToInt32(strs11[1]) * 60;
                        bufTimeRangeList03.endle_timestamp = Convert.ToInt32(strs12[0]) * 3600 + Convert.ToInt32(strs12[1]) * 60;
                        AnsAuthorizedConfigurationList[0].time_range_list.Add(bufTimeRangeList03);
                        break;
                    case 3:
                        string[] strs13 = buf_CalculatePassTime.m_StrS1.Split(‘:’);
                        string[] strs14 = buf_CalculatePassTime.m_StrE1.Split(‘:’);
                        string[] strs15 = buf_CalculatePassTime.m_StrS2.Split(‘:’);
                        string[] strs16 = buf_CalculatePassTime.m_StrE2.Split(‘:’);
                        string[] strs17 = buf_CalculatePassTime.m_StrS3.Split(‘:’);
                        string[] strs18 = buf_CalculatePassTime.m_StrE3.Split(‘:’);
                        bufTimeRangeList01.start_timestamp = Convert.ToInt32(strs13[0]) * 3600 + Convert.ToInt32(strs13[1]) * 60;
                        bufTimeRangeList01.endle_timestamp = Convert.ToInt32(strs14[0]) * 3600 + Convert.ToInt32(strs14[1]) * 60;
                        AnsAuthorizedConfigurationList[0].time_range_list.Add(bufTimeRangeList01);
                        bufTimeRangeList02.start_timestamp = Convert.ToInt32(strs15[0]) * 3600 + Convert.ToInt32(strs15[1]) * 60;
                        bufTimeRangeList02.endle_timestamp = Convert.ToInt32(strs16[0]) * 3600 + Convert.ToInt32(strs16[1]) * 60;
                        AnsAuthorizedConfigurationList[0].time_range_list.Add(bufTimeRangeList02);
                        bufTimeRangeList03.start_timestamp = Convert.ToInt32(strs17[0]) * 3600 + Convert.ToInt32(strs17[1]) * 60;
                        bufTimeRangeList03.endle_timestamp = Convert.ToInt32(strs18[0]) * 3600 + Convert.ToInt32(strs18[1]) * 60;
                        AnsAuthorizedConfigurationList[0].time_range_list.Add(bufTimeRangeList03);
                        break;
                    default:
                        string[] strs19 = “00:00”.Split(‘:’);
                        string[] strs20 = “00:00”.Split(‘:’);
                        string[] strs21 = “00:00”.Split(‘:’);
                        string[] strs22 = “00:00”.Split(‘:’);
                        string[] strs23 = “00:00”.Split(‘:’);
                        string[] strs24 = “00:00”.Split(‘:’);
                        bufTimeRangeList01.start_timestamp = Convert.ToInt32(strs19[0]) * 3600 + Convert.ToInt32(strs19[1]) * 60;
                        bufTimeRangeList01.endle_timestamp = Convert.ToInt32(strs20[0]) * 3600 + Convert.ToInt32(strs20[1]) * 60;
                        AnsAuthorizedConfigurationList[0].time_range_list.Add(bufTimeRangeList01);
                        bufTimeRangeList02.start_timestamp = Convert.ToInt32(strs21[0]) * 3600 + Convert.ToInt32(strs21[1]) * 60;
                        bufTimeRangeList02.endle_timestamp = Convert.ToInt32(strs22[0]) * 3600 + Convert.ToInt32(strs22[1]) * 60;
                        AnsAuthorizedConfigurationList[0].time_range_list.Add(bufTimeRangeList02);
                        bufTimeRangeList03.start_timestamp = Convert.ToInt32(strs23[0]) * 3600 + Convert.ToInt32(strs23[1]) * 60;
                        bufTimeRangeList03.endle_timestamp = Convert.ToInt32(strs24[0]) * 3600 + Convert.ToInt32(strs24[1]) * 60;
                        AnsAuthorizedConfigurationList[0].time_range_list.Add(bufTimeRangeList03);
                        break;
                }
            }
            //–

        }//for (int i = 0; i < AL_AnsData.Count; i++)

        //整合傳送參數-SendAnsData
        //整合傳送參數-AnsAuthorization

        //—
        //修改授權時呼叫SYDM_GET_CONTROLLER_CONNECTION API位置,為了減少呼叫該API次數
        /*
        //—
        //SYDM和SYCG API呼叫並存實現
        if (!Main_Frm.pForm1.m_changeSYCGMode)//SYDM
        {
            Main_Frm.pForm1.m_blnAPI = HW_Net_API.getController_Connection();
        }
        else//SYCG
        {
            Main_Frm.pForm1.m_blnAPI = HW_Net_API.SYCG_getSYDMList();
            if (Main_Frm.pForm1.m_blnAPI)
            {
                HW_Net_API.m_Controller_Connection.controllers.Clear();
                for (int l = 0; l < Main_Frm.m_Sydms.sydms.Count; l++)
                {
                    HW_Net_API.SYCG_callSYDMCommand(“SYDM_GET_CONTROLLER_CONNECTION”, “”, Main_Frm.m_Sydms.sydms[l].identifier.ToString());
                }
            }
        }
        //—SYDM和SYCG API呼叫並存實現
        */
        //—修改授權時呼叫SYDM_GET_CONTROLLER_CONNECTION API位置,為了減少呼叫該API次數

        //–
        //AnsAuthorization指定SYDM控制器ID-呼叫Getsy_dm_Controller_id
        AnsAuthorization.identifier = Main_Frm.pForm1.Getsy_dm_Controller_id(Strconnetction_mode, Strcontroller_IP, Strcontroller_Port);
        //–

        //–
        //AnsAuthorization指定指定卡號-sendData2HW()中增加抓取卡片內碼
        AnsAuthorization.card_unique_identifier = Strcard_code;
        //–

        //–
        //AnsAuthorization指定APB參數
        AnsAuthorization.apb_enabled = Convert.ToInt32(Strcard_apb_apb_enabled);
        AnsAuthorization.apb_level_value = Convert.ToInt32(Strcard_apb_level_value);
        //–

        //–
        //AnsAuthorization指定display_text參數
        AnsAuthorization.display_text = Strcard_display;
        //–

        //–
        //AnsAuthorization指定pin_code參數
        AnsAuthorization.pin_code = Strcard_pin_code;
        //–

        //–
        //AnsAuthorization指定valid_start_timestamp+valid_endle_timestamp參數
        DateTime dt0 = new DateTime(2000, 1, 1, 0, 0, 0);
        DateTime dt1;
        DateTime dt2;
        try
        {
            dt1 = Convert.ToDateTime(Strcard_valid_start);
        }
        catch
        {
            dt1 = new DateTime(2000, 1, 1, 0, 0, 0);//卡片時間匯入未填在授權運算時自動轉換成2000/01/01和2068/01/01
        }
        try
        {
            dt2 = Convert.ToDateTime(Strcard_valid_endle);
        }
        catch
        {
            dt2 = new DateTime(2068, 1, 1, 0, 0, 0);//卡片時間匯入未填在授權運算時自動轉換成2000/01/01和2068/01/01
        }
        TimeSpan ts01 = dt1 – dt0;
        TimeSpan ts02 = dt2 – dt0;
        AnsAuthorization.valid_start_timestamp = (Int64)ts01.TotalSeconds;
        AnsAuthorization.valid_endle_timestamp = (Int64)ts02.TotalSeconds;
        //–

        //–
        //sendData2HW()中增加計算那些門或那些樓層可通行的flag
        AnsAuthorization.door_accessable_flags = door_accessable_flags;
        for (int l = 0; l < floor_flags_list.Length; l++)
        {
            AnsAuthorization.floor_flags_list.Add(floor_flags_list[l]);
        }
        //–

        //–
        //把資料從『門(N個)VS卡』-> 『控(1個)VS卡』
        for (int l = 0; l < AnsAuthorizedConfigurationList.Length; l++)
        {
            AnsAuthorization.authorized_configuration_list.Add(AnsAuthorizedConfigurationList[l]);
        }
        //–

        for (int i = 0; i < doorstate.Length; i++)
        {
            if (doorstate[i] != 0)
            {
                blnDeleteCard = false;
                break;
            }
        }

        if (blnDeleteCard == true)
        {
            //執行刪卡
            DelAuthorization.identifier = AnsAuthorization.identifier;
            DelAuthorization.card_unique_identifier = AnsAuthorization.card_unique_identifier;
            DelSendAnsData.authorizations.Add(DelAuthorization);

            DelAuthorization = null;
            DelAuthorization = new DelAuthorization();

        }
        else
        {
            //執行傳卡
            SendAnsData.authorizations.Add(AnsAuthorization);

            AnsAuthorization = null;
            AnsAuthorization = new Authorization();
        }
        //—

        //修改對應已傳送的授權資料
        //直接刪除state=-1的授權資料
        //複寫同卡ID和門ID的授權資料
        //—
        //實作傳送授權參數函數-50%
        for (int i = 0; i < AL_AnsData.Count; i++)
        {
            if (((AnsData)AL_AnsData[i]).state <= 0)
            {
                //SQL = String.Format(“DELETE FROM authorization_data WHERE (card_id='{0}’) AND (door_id='{1}’);”, ((AnsData)AL_AnsData[i]).Strcard_id, ((AnsData)AL_AnsData[i]).Strdoor_id);
                SQL = String.Format(“UPDATE authorization_data SET state = ‘-100′ WHERE (card_id='{0}’) AND (door_id='{1}’);”, ((AnsData)AL_AnsData[i]).Strcard_id, ((AnsData)AL_AnsData[i]).Strdoor_id);//修正DB派送授權的紀錄狀態語法讓DB支援派送失敗也可復原狀態值
            }
            else
            {
                //SQL = String.Format(“UPDATE authorization_data SET state = ‘0’ WHERE (card_id='{0}’) AND (door_id='{1}’);”, ((AnsData)AL_AnsData[i]).Strcard_id, ((AnsData)AL_AnsData[i]).Strdoor_id);
                SQL = String.Format(“UPDATE authorization_data SET state = ‘100’ WHERE (card_id='{0}’) AND (door_id='{1}’);”, ((AnsData)AL_AnsData[i]).Strcard_id, ((AnsData)AL_AnsData[i]).Strdoor_id);//修正DB派送授權的紀錄狀態語法讓DB支援派送失敗也可復原狀態值
            }
            FileLib.logFile(“HW_SQL_track.log”, SQL + “-9-” + DateTime.Now.ToString(“HHmmss”));//增加HW_SQL_track.log功能,為了簡化SQL查詢做準備
            MySQL.InsertUpdateDelete(SQL);
        }
        //—

        //判斷是否還有未傳送的授權資料    ~   SELECT * FROM  `authorization_data` WHERE state <> 0;
        //找出 第一筆狀態>0 的資料,並找出對應控制器
        //—
        //實作傳送授權參數函數-10%
        SQL = “SELECT * FROM  authorization_data WHERE (state=1 OR state=-1);”;//SQL = String.Format(“SELECT * FROM  authorization_data WHERE state <> ‘{0}’;”, 0);
        FileLib.logFile(“HW_SQL_track.log”, SQL + “-7-” + DateTime.Now.ToString(“HHmmss”));//增加HW_SQL_track.log功能,為了簡化SQL查詢做準備
        Reader_Data = MySQL.GetDataReader(SQL);
        if (Reader_Data.HasRows == true)
        {
            blnloop = Reader_Data.HasRows;
            Reader_Data.Read();
            Strcard_id = Reader_Data[“card_id”].ToString();
            Strdoor_id = Reader_Data[“door_id”].ToString();
            Reader_Data.Close();
            Reader_Data = null;
            //–
            //sendData2HW()中增加抓取卡片內碼+卡片display+卡片pin_code+卡片效期+卡片APB
            Strcard_code = “”;
            SQL = String.Format(“SELECT card_code,display,pin,apb_level_value FROM card WHERE id='{0}’;”, Strcard_id);
            FileLib.logFile(“HW_SQL_track.log”, SQL + “-8-” + DateTime.Now.ToString(“HHmmss”));//增加HW_SQL_track.log功能,為了簡化SQL查詢做準備
            Reader_Data = MySQL.GetDataReader(SQL);
            Reader_Data.Read();
            Strcard_code = Reader_Data[“card_code”].ToString();
            Strcard_display = Reader_Data[“display”].ToString();
            Strcard_pin_code = Reader_Data[“pin”].ToString();
            Strcard_apb_level_value = Reader_Data[“apb_level_value”].ToString();
            Strcard_valid_start = “”;
            Strcard_valid_endle = “”;
            Strcard_apb_apb_enabled = “”;
            Reader_Data.Close();
            Reader_Data = null;
            //–
        }
        else
        {
            Reader_Data.Close();
            Reader_Data = null;
            blnloop = false;//沒有資料要傳送,直接離開
        }
        //—

    } while (blnloop);

    String StrAns = “”;
    String StrTxtData = “”;//修正傳送授權內容到紀錄文字檔符合SYDM/SYCG兩種模式
    bool blncheck = false;
    if (blnDeleteCard == true)
    {
        //執行刪卡
        //—
        //SYDM和SYCG API呼叫並存實現
        if (!Main_Frm.pForm1.m_changeSYCGMode)//SYDM
        {
            StrAns = parseJSON.composeJSONCControllerDelAuthorization(DelSendAnsData);
            blncheck = HW_Net_API.delControllerAuthorization(StrAns);//SYDM控制器授權API呼叫
            StrTxtData = StrAns;//修正傳送授權內容到紀錄文字檔符合SYDM/SYCG兩種模式
            if (!blncheck)
            {
                StrTxtData = StrTxtData + “-ERROR\n”;//原本設計如果傳送授權失敗不記錄傳送內容,現在要改成都要記錄下來授權的JSON,錯誤的在後面加上-ERROR
            }
        }
        else//SYCG
        {
            ControllerDelAuthorization SYCG_DelSendAnsData = new ControllerDelAuthorization();//實際傳送變數值
            //—
            //把相同SYDM的授權命令集合一次傳送 ~ 依照SYDM進行授權資料分類+實際傳送 
            /*
            for (int l = 0; l < DelSendAnsData.authorizations.Count; l++)
            {
                SYCG_DelSendAnsData.authorizations.Clear();
                SYCG_DelSendAnsData.authorizations.Add(DelSendAnsData.authorizations[l]);
                StrAns = parseJSON.composeJSONCControllerDelAuthorization(SYCG_DelSendAnsData);
                blncheck = HW_Net_API.SYCG_callSYDMCommand(“SYDM_DELETE_CONTROLLER_AUTHORIZATION”, StrAns, (String)AL_sydm_id[l]);
                if (!blncheck)
                {
                    StrTxtData = StrTxtData + StrAns + “-ERROR\n”;//原本設計如果傳送授權失敗不記錄傳送內容,現在要改成都要記錄下來授權的JSON,錯誤的在後面加上-ERROR
                    //授權時改成就算有錯也要每一筆都傳- break;
                }
                else
                {
                    StrTxtData = StrTxtData + StrAns + “\n”;//修正傳送授權內容到紀錄文字檔符合SYDM/SYCG兩種模式
                }
            }//for (int l = 0; l < DelSendAnsData.authorizations.Count; l++)
            */
            for (int l = 0; l < AL_sydmAll.Count; l++)
            {
                String[] Strchecksydm = AL_sydmAll[l].ToString().Split(‘,’);
                SYCG_DelSendAnsData.authorizations.Clear();
                for (int m = 0; m < DelSendAnsData.authorizations.Count; m++)
                {
                    if (Strchecksydm[0] == (String)AL_sydm_id[m])
                    {
                        SYCG_DelSendAnsData.authorizations.Add(DelSendAnsData.authorizations[m]);
                    }
                }//for (int m = 0; m < DelSendAnsData.authorizations.Count; m++)
                if (SYCG_DelSendAnsData.authorizations.Count > 0)
                {
                    StrAns = parseJSON.composeJSONCControllerDelAuthorization(SYCG_DelSendAnsData);
                    blncheck = HW_Net_API.SYCG_callSYDMCommand(“SYDM_DELETE_CONTROLLER_AUTHORIZATION”, StrAns, Strchecksydm[1]);
                    if (!blncheck)
                    {
                        StrTxtData = StrTxtData + StrAns + “-ERROR\n”;//原本設計如果傳送授權失敗不記錄傳送內容,現在要改成都要記錄下來授權的JSON,錯誤的在後面加上-ERROR
                        //授權時改成就算有錯也要每一筆都傳- break;
                    }
                    else
                    {
                        StrTxtData = StrTxtData + StrAns + “\n”;//修正傳送授權內容到紀錄文字檔符合SYDM/SYCG兩種模式
                    }
                }//if (SYCG_DelSendAnsData.authorizations.Count > 0)
            }//for (int l = 0; l < AL_sydmAll.Count; l++)
            //—把相同SYDM的授權命令集合一次傳送 ~ 依照SYDM進行授權資料分類+實際傳送 
        }
        //—SYDM和SYCG API呼叫並存實現

    }
    else
    {
        //執行傳卡
        //—
        //SYDM和SYCG API呼叫並存實現
        if (!Main_Frm.pForm1.m_changeSYCGMode)//SYDM
        {
            StrAns = parseJSON.composeJSONControllerAuthorization(SendAnsData);
            blncheck = HW_Net_API.addControllerAuthorization(StrAns);//SYDM控制器授權API呼叫
            StrTxtData = StrAns;//修正傳送授權內容到紀錄文字檔符合SYDM/SYCG兩種模式
            if (!blncheck)
            {
                StrTxtData = StrTxtData + “-ERROR\n”;//原本設計如果傳送授權失敗不記錄傳送內容,現在要改成都要記錄下來授權的JSON,錯誤的在後面加上-ERROR
            }
        }
        else//SYCG
        {
            ControllerAuthorization SYCG_SendAnsData = new ControllerAuthorization();//實際傳送變數值
            //—
            //把相同SYDM的授權命令集合一次傳送 ~ 依照SYDM進行授權資料分類+實際傳送 
            /*
            for (int l = 0; l < SendAnsData.authorizations.Count; l++)
            {
                SYCG_SendAnsData.authorizations.Clear();
                SYCG_SendAnsData.authorizations.Add(SendAnsData.authorizations[l]);
                StrAns = parseJSON.composeJSONControllerAuthorization(SYCG_SendAnsData);
                blncheck = HW_Net_API.SYCG_callSYDMCommand(“SYDM_ADD_CONTROLLER_AUTHORIZATION”, StrAns, (String)AL_sydm_id[l]);
                if (!blncheck)
                {
                    StrTxtData = StrTxtData + StrAns + “-ERROR\n”;//原本設計如果傳送授權失敗不記錄傳送內容,現在要改成都要記錄下來授權的JSON,錯誤的在後面加上-ERROR
                    //授權時改成就算有錯也要每一筆都傳- break;
                }
                else
                {
                    StrTxtData = StrTxtData + StrAns + “\n”;//修正傳送授權內容到紀錄文字檔符合SYDM/SYCG兩種模式
                }
            }//for (int l = 0; l < SendAnsData.authorizations.Count; l++)
            */
            for (int l = 0; l < AL_sydmAll.Count; l++)
            {
                String[] Strchecksydm = AL_sydmAll[l].ToString().Split(‘,’);
                SYCG_SendAnsData.authorizations.Clear();
                for (int m = 0; m < SendAnsData.authorizations.Count; m++)
                {
                    if (Strchecksydm[0] == (String)AL_sydm_id[m])
                    {
                        SYCG_SendAnsData.authorizations.Add(SendAnsData.authorizations[m]);
                    }
                }//for (int m = 0; m < SendAnsData.authorizations.Count; m++)
                if (SYCG_SendAnsData.authorizations.Count > 0)
                {
                    StrAns = parseJSON.composeJSONControllerAuthorization(SYCG_SendAnsData);
                    blncheck = HW_Net_API.SYCG_callSYDMCommand(“SYDM_ADD_CONTROLLER_AUTHORIZATION”, StrAns, Strchecksydm[1]);
                    if (!blncheck)
                    {
                        StrTxtData = StrTxtData + StrAns + “-ERROR\n”;//原本設計如果傳送授權失敗不記錄傳送內容,現在要改成都要記錄下來授權的JSON,錯誤的在後面加上-ERROR
                        //授權時改成就算有錯也要每一筆都傳- break;
                    }
                    else
                    {
                        StrTxtData = StrTxtData + StrAns + “\n”;//修正傳送授權內容到紀錄文字檔符合SYDM/SYCG兩種模式
                    }
                }//if (SYCG_SendAnsData.authorizations.Count > 0)
            }//for (int l = 0; l < AL_sydmAll.Count; l++)
            //—把相同SYDM的授權命令集合一次傳送 ~ 依照SYDM進行授權資料分類+實際傳送 
        }
        //—SYDM和SYCG API呼叫並存實現
    }

    //—
    //修正DB派送授權的紀錄狀態語法讓DB支援派送失敗也可復原狀態值
    if (blncheck)//傳送成功
    {
        SQL = “DELETE FROM authorization_data WHERE state = ‘-100’;”;
        FileLib.logFile(“HW_SQL_track.log”, SQL + “-10-” + DateTime.Now.ToString(“HHmmss”));//增加HW_SQL_track.log功能,為了簡化SQL查詢做準備
        MySQL.InsertUpdateDelete(SQL);
        SQL = “UPDATE authorization_data SET state = ‘0’ WHERE state = ‘100’;”;
        FileLib.logFile(“HW_SQL_track.log”, SQL + “-11-” + DateTime.Now.ToString(“HHmmss”));//增加HW_SQL_track.log功能,為了簡化SQL查詢做準備
        MySQL.InsertUpdateDelete(SQL);
    }
    else//傳送失敗
    {
        SQL = “UPDATE authorization_data SET state = ‘-1’ WHERE state = ‘-100’;”;
        FileLib.logFile(“HW_SQL_track.log”, SQL + “-12-” + DateTime.Now.ToString(“HHmmss”));//增加HW_SQL_track.log功能,為了簡化SQL查詢做準備
        MySQL.InsertUpdateDelete(SQL);
        SQL = “UPDATE authorization_data SET state = ‘1’ WHERE state = ‘100’;”;
        FileLib.logFile(“HW_SQL_track.log”, SQL + “-13-” + DateTime.Now.ToString(“HHmmss”));//增加HW_SQL_track.log功能,為了簡化SQL查詢做準備
        MySQL.InsertUpdateDelete(SQL);
    }
    //—

    FileLib.TxtFile(“authorization_data.txt”, StrTxtData);//修正傳送授權內容到紀錄文字檔符合SYDM/SYCG兩種模式- FileLib.TxtFile(“authorization_data.txt”, StrAns);//授權JSON字串存檔(紀錄最後一次)
}//public static void sendData2HW()
//—建立傳送授權參數函數_V0201

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *