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