




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、億陽退服專題軟件V2.0 源代碼61-1using System;using System.Collections; using System.Data;using System.Data.OleDb; using System.Data.Odbc; using System.ServiceProcess; using System.Threading; using System.Data.OleDb; using System.Net;using System.Net.Sockets; using System.Text;using System.Xml; using System.IO;u
2、sing AlarmBoardService.faultService;using AlarmBoardService.SendSMS;namespace AlarmBoardServicepublic enum ServiceHandleStatusStarting = 0,Running = 1,Stopping = 2/ 啟動中/ 正常運行中/ 停止中public partial class Service : ServiceBase#region 字段ArrayList listMsg = new ArrayList(); ArrayList listMsgExc = new Arra
3、yList(); DataTable handDt,countDt;Hashtable objClassHt=new Hashtable ();/告警專業(yè),objectClass 字典表Hashtable lightHt = new Hashtable();/告警類型,燈顏色字典表private MQMsgProxy mqMsgProxy = null;private Handler hander = null;private AlarmFilter alarmFilter = null;private System.Timers.Timer timerMQReconnect;public S
4、erviceHandleStatus serviceHandleStatus = ServiceHandleStatus.Starting; public bool bSendSynchAlarm = true;public ArrayList aryAlarmItem = new ArrayList();/private Thread SAHandlerThread; private Socket clientSocket1; private Socket serverSocket1; private Socket clientSocket2; private Socket serverSo
5、cket2; private Socket clientSocket15; private Socket serverSocket15;private byte dataPro = new byte256; private int m = 0;億陽退服專題軟件V2.0 源代碼61-2private string strAutoSynch = "" private string strStartServiceSynch = "" private TcpListener listener;private Hashtable connections;/priv
6、ate OleDbConnection myDbConn; private OdbcConnection myDbConn; private int updateTime;private string phoneList;private string phoneMsg; #endregion/ 自動同步(以小時為)/ 啟動同步(以天為)#region <<<Properties>>> public TcpListener Listenergetreturn listener;setlistener = value;public Hashtable Clien
7、tConnectionsgetreturn connections;setconnections = value;#endregion#region before public Service()/ Thread.Sleep(20000); InitializeComponent();private bool InitMQ(bool bForceReconnect)億陽退服專題軟件V2.0 源代碼61-3bool bRet = true; tryif (bForceReconnect)if (mqMsgProxy != null)mqMsgProxy.Stop();mqMsgProxy = n
8、ull; clear();if (mqMsgProxy = null)mqMsgProxy = new MQMsgProxy(); mqMsgProxy.recAlarmMQMsgProxy.OnReceiveAlarm(OnReceiveAlarm);mqMsgProxy.alarmOperationMsg MQMsgProxy.OnAlarmOperationMsg(OnAlarmOperationMsg);mqMsgProxy.filterChangeMsgMQMsgProxy.OnFilterChangeMsg(OnFilterChanged);=new=new=newmqMsgPro
9、xy.mqClosed = new MQMsgProxy.OnMQClosed(OnMQClosed);bRet = mqMsgProxy.Start();catch (Exception ex)bRet = false;Debug.WriteDebugInfo(int)Debug.InfoType.Error, "ServiceError", "InitMQ 失敗:0。", ex.ToString();/this.hander.mqProxy = this.mqMsgProxy; return bRet;/thread runvoid SAHandle
10、rStart()try/Thread.Sleep(20000); InitDt(); LoadXmlData();phoneList = Config.AppSettings.GetStringValue("PhoneNumList", ""); phoneMsg = Config.AppSettings.GetStringValue("PhoneMsg", "");string strCon = Config.AppSettings.GetStringValue("NMOSDB.Con2",
11、"");/myDbConn = new OleDbConnection(strCon);億陽退服專題軟件V2.0 源代碼61-4myDbConn = new OdbcConnection(strCon); myDbConn.Open();Debug.WriteDebugInfo(int)Debug.InfoType.Information, "OpenDB", "數(shù)據(jù)庫連接:0", DateTime.Now.ToString();updateTime = Config.AppSettings.GetIntValue("Che
12、ckTime", 1) * 1000;初始化/啟動Socket,名和IP/ IPAddress serverIP = IPAddress.Parse(""); String hostname = Dns.GetHostName();IPAddress serverIP = Dns.GetHostEntry(hostname).AddressList0;/ Server Port = 13string Port1 = "13" / 13 端口用于與告警板之間的Socket 通信string Port2 = "14&qu
13、ot; / 14 端口用于與其他專業(yè)直接的接口Socket 通信string Port3 = "15" / 15 端口用于接受其他專業(yè)告警的SocketIPEndPoint serverhost1 = new IPEndPoint(serverIP, Int32.Parse(Port1); IPEndPoint serverhost2 = new IPEndPoint(serverIP, Int32.Parse(Port2);IPEndPoint serverhost15 = new IPEndPoint(serverIP, Int32.Parse(Port3);serve
14、rSocket1 = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);serverSocket2 = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);serverSocket15 = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);serverSocket1.Bind(serverhost1);se
15、rverSocket2.Bind(serverhost2); serverSocket15.Bind(serverhost15);/ Backlog = 50 serverSocket1.Listen(50); serverSocket2.Listen(50);serverSocket15.Listen(50);Thread p1 = new Thread(new ThreadStart(StartServer13); p1.Start();Thread p15 = new Thread(new ThreadStart(StartServer15);p15.Start();/Thread.Sl
16、eep(4000);Debug.WriteDebugInfo(int)Debug.InfoType.Information, "StartTime", "初始化開始時間:0", DateTime.Now.ToString();alarmFilter = new AlarmFilter();hander = new Handler();/components = new System.ComponentM.Container();timerMQReconnect = new System.Windows.Forms.Timer(ponents);億陽退服專
17、題軟件V2.0 源代碼61-5/timerMQReconnect.Interval = 10000;timerMQReconnect.Tick+=newSystem.EventHandler(this.timerMQReconnect_Tick);timerMQReconnect = new System.Timers.Timer(10000.00);timerMQReconnect.ElapsedSystem.Timers.ElapsedEventHandler(timerMQReconnect_Tick);+=newDebug.WriteDebugInfo(int)Debug.InfoTy
18、pe.Information,"StartTime","newSystem.EventHandler(this.timerMQReconnect_Tick)結束時間:0", DateTime.Now.ToString(); bool bOk = InitMQ(false);if (!bOk)serviceHandleStatus = ServiceHandleStatus.Stopping;if (hander != null)hander.Dispose();/this.hander.Stop();if (alarmFilter != null)ala
19、rmFilter.Dispose();/ return;throw new Exception("初始化MQ 連接失敗,將系統(tǒng)!");/ modify endDebug.WriteDebugInfo(int)Debug.InfoType.Information, "StartTime", " InitMQ(true)結束時間:0", DateTime.Now.ToString();Thread p14 = new Thread(new ThreadStart(StartServer14); p14.Start();/*/步和啟動服務的
20、同步/App.config 文件中的同步時間的配置,包括自動定時同strAutoSynch = Config.AppSettings"AutoSynchronize"同步(以小時為)strStartServiceSynch = Config.AppSettings"Synchronization"/ 自動/ 啟動同步(以天為)if (strAutoSynch != "")System.Threading.ThreadthreadAutoSynch=newSystem.Threading.Thread(new System.Thread
21、ing.ThreadStart(AutoSynch); threadAutoSynch.Start();/this.hander.Resamp();億陽退服專題軟件V2.0 源代碼61-6if (strStartServiceSynch != "")System.Threading.Threadt System.Threading.ThreadStart(SynchDataFromDB);=newSystem.Threading.Thread(newDebug.WriteDebugInfo(int)Debug.InfoType.Information, "Sync
22、hAlarm", "啟動同步告警的線程!t.Start()");t.Start();*/catch (Exception ex)Debug.WriteDebugInfo(int)Debug.InfoType.Error, "ServiceError", ex.ToString(); throw;/ <summary>/ 自動同步(以小時為/ </summary> void AutoSynch())每隔N 小時將內(nèi)存中的告警向告警板一次inime = int.Parse(strAutoSynch); / 以小時為while
23、 (true)Thread.Sleep(nTime * 3600 * 1000);Resamp();int nCount1 = hander.aryAlarms.Count; for (int nI = 0; nI < nCount1; nI+)stringfileType="PrintAlarmCatch_"+DateTime.Now.ToString("yyyyMMdd_HHmmss");AlarmItem aItem = (AlarmItem)hander.aryAlarmsnI;Debug.WriteDebugInfoNoSpe(int)D
24、ebug.InfoType.Error,fileType,aItem.ToString();if (aItem.Confirmed)if (aItem.RedSeverity = 6)SendMsgToClient("R;L;");elseSendMsgToClient("Y;O;");億陽退服專題軟件V2.0 源代碼61-7elseif (aItem.RedSeverity = 6)SendMsgToClient("R;");elseSendMsgToClient("Y;");Thread.Sleep(1000)
25、;void SynchDataFromDB()tryDebug.WriteDebugInfo(int)Debug.InfoType.Information,步告警的線程內(nèi)存空間");double dbStartSynch = double.Parse(strStartServiceSynch); DateTime dt = DateTime.Now;"SynchAlarm", "進入同string strCurTime = dt.ToString("yyyy-MM-dd HH:mm:ss"); dt = dt.AddDays(-dbS
26、tartSynch);string strTimeAfter3Days = dt.ToString("yyyy-MM-dd HH:mm:ss");/stringconnecionString="Provider=OraOLEDB.Oracle.1;Password=nmosoptr;Persist Security Info=True;User ID=nmosdb;DataSource=shnmos"/stringconnecionStringInfo=True;User=ID=informix;Data"Provider=Ifxoledbc;
27、Password=dba#pwd0;Persist Source=nmosdbids921"Securityint dbType = Config.AppSettings.GetIntValue("NMOSDB.DBType", 0);Debug.WriteDebugInfo(int)Debug.InfoType.Information, "SynchAlarm", "獲得數(shù)據(jù)庫類型NMOSDB.DBType:0", dbType);string strCon = Config.AppSettings.GetStringVa
28、lue("NMOSDB.Con", "");Debug.WriteDebugInfo(int)Debug.InfoType.Information, "SynchAlarm", "獲得數(shù)據(jù)庫聯(lián)接字符串NMOSDB.Con:0", strCon);string connectionString = strCon;Debug.WriteDebugInfo(int)Debug.InfoType.Information, "SynchAlarm", " 建立 connection 字符串:0&
29、quot;, connectionString);億陽退服專題軟件V2.0 源代碼61-8/ ack_flag = 0 為新的活動告警,ack_flag = 1 為確認的告警string strTmp = "select * from tfa_alarm where active_status = 1 and event_time between '0' and '1' and redefine_severity = 6 and ack_flag = 1"string queryString = string.Format(strTmp, s
30、trTimeAfter3Days, strCurTime);/Debug.WriteDebugInfo(int)Debug.InfoType.Information,同步告警數(shù)據(jù)SQL:0n", queryString);"SynchAlarm", "using (OleDbConnection connection = new OleDbConnection(connectionString)connection.Open();/Debug.WriteDebugInfo(int)Debug.InfoType.Information, "Syn
31、chAlarm", "connection.Open()建立連接!");OleDbCommand command = connection.CreateCommand(); command.CommandText = queryString;OleDbDataAdapter da = new OleDbDataAdapter(command); DataTable datatable = new DataTable();da.Fill(datatable);/Debug.WriteDebugInfo(int)Debug.InfoType.Information,
32、"SynchAlarm", "da.Fill(datatable)入數(shù)據(jù)表DataTable!");foreach (DataRow dr in datatable.Rows)添Debug.WriteDebugInfo(int)Debug.InfoType.Information, "SynchAlarm", DataTable 中的DataRow 填充AlarmItem 結構!");AlarmItem item = new AlarmItem();item.FP0 = BOCO.APP.Common.Util.Conv.T
33、oUint(dr"fp0"); item.FP1 = BOCO.APP.Common.Util.Conv.ToUint(dr"fp1"); item.FP2 = BOCO.APP.Common.Util.Conv.ToUint(dr"fp2"); item.FP3 = BOCO.APP.Common.Util.Conv.ToUint(dr"fp3"); item.CFP0 = BOCO.APP.Common.Util.Conv.ToUint(dr"c_fp0"); item.CFP1 = BOC
34、O.APP.Common.Util.Conv.ToUint(dr"c_fp1"); item.CFP2 = BOCO.APP.Common.Util.Conv.ToUint(dr"c_fp2"); item.CFP3 = BOCO.APP.Common.Util.Conv.ToUint(dr"c_fp3");"item.RedSeverity BOCO.APP.Common.Util.Conv.ToInt(dr"redefine_severity");item.ActiveStatus BOCO.APP.
35、Common.Util.Conv.ToInt(dr"active_status");item.AckFlag = BOCO.APP.Common.Util.Conv.ToInt(dr"ack_flag"); item.AlarmTitleBOCO.APP.Common.Util.Conv.ToInt(dr"alarm_title");item.ObjectClass BOCO.APP.Common.Util.Conv.ToInt(dr"object_class");item.ProbableCauseBOCO.AP
36、P.Common.Util.Conv.ToInt(dr"probable_cause");=/item.getAckFlag = BOCO.APP.Common.Util.Conv.ToInt(dr"ack_flag");item.Confirmed = true;億陽退服專題軟件V2.0 源代碼61-9Debug.WriteDebugInfo(int)Debug.InfoType.Information, "SynchAlarm", "同步到的告警數(shù)據(jù):fp0 = 0, c_fp0 = 1, redefine_severi
37、ty = 2", item.FP0, item.CFP0, item.RedSeverity);/this.hander.AddNewAlarm(item);if (item.IsNewAlarm)if (hander.IsExists(item) / 該告警已經(jīng)存在Debug.WriteDebugInfo(int)Debug.InfoType.Information, "repAlarm", "FP 相同:" + item.FPKey);return;elseif (item.ObjectClass = 101 && item
38、.ProbableCause = 102 | item.ObjectClass = 102 && item.ProbableCause = 102 | item.ObjectClass = 101 && item.ProbableCause = 122 | item.ObjectClass = 102 && item.ProbableCause = 122 | item.ObjectClass = 101 && item.ProbableCause = 2064|item.ObjectClass = 102 &&
39、item.ProbableCause = 2064)/hander.AddSynchAlarm(item); aryAlarmItem.Add(item);else if (item.IsClearAlarm)ClearAlarmByCFP(item.CFP0, item.CFP1, item.CFP2, item.CFP3);Thread.Sleep(1000);catch (Exception e)Debug.WriteDebugInfo(int)Debug.InfoType.Error, "SynchDataFromDB Error:n0", e.ToString()
40、;"MsgHanderError",/tread stopvoid SAHandlerStop()serviceHandleStatus = ServiceHandleStatus.Stopping;億陽退服專題軟件V2.0 源代碼61-10if (hander != null)hander.Dispose();/this.hander.Stop();if (mqMsgProxy != null)mqMsgProxy.Stop(); mqMsgProxy.Dispose();if (alarmFilter != null)alarmFilter.Dispose();myDb
41、Conn.Close();protected override void OnStart(string args)/ TODO: Add code here to start your service./Thread.Sleep(1000); SAHandlerStart();protected override void OnStop()/ TODO: Add code here to perform any tear-down necessary to stop your service.SAHandlerStop();public int SendMsgToClient(string s
42、trMsg)try/clientSocket1 = serverSocket1.Accept();byte byteData = Encoding.ASCII.GetBytes(strMsg.ToCharArray();m = clientSocket1.Send(byteData, 0, byteData.Length, SocketFlags.None); return 1;/Thread.Sleep(100);catch (Exception ex)clientSocket1.Close(); return 0;return m;public int SendMsgToClient14(
43、string strMsg)億陽退服專題軟件V2.0 源代碼61-11byte byteData = Encoding.ASCII.GetBytes(strMsg.ToCharArray();m = clientSocket2.Send(byteData, 0, byteData.Length, SocketFlags.None); return m;public bool Resamp()SendMsgToClient("Q;"); return true;public void ConfirmAlarm(uint fp0, uint fp1, uint fp2, uin
44、t fp3)lock (hander.aryAlarms)for (int i = 0; i < hander.aryAlarms.Count; i+)AlarmItem alarm = (AlarmItem)hander.aryAlarmsi; if (alarm.IsFPMatch(fp0, fp1, fp2, fp3)if (!alarm.Confirmed)alarm.Confirmed = true;string strFP = alarm.FP0.ToString() + ":" strFP += alarm.FP1.ToString() + "
45、:" strFP += alarm.FP2.ToString() + ":" strFP += alarm.FP3.ToString();Debug.WriteDebugInfoNoSpe(int)Debug.InfoType.Information,"AlampCmd", DateTime.Now.ToString() + "-確認告警FP:0rn", strFP);if (alarm.IsCriticalAlarm)SendMsgToClient("L;");elseSendMsgToClient(&
46、quot;O;");break;public void ClearAlarmByCFP(uint cfp0, uint cfp1, uint cfp2, uint cfp3)lock (hander.aryAlarms)億陽退服專題軟件V2.0 源代碼61-12int nCount = hander.aryAlarms.Count; for (int i = nCount - 1; i >= 0; i-)AlarmItem alarm = (AlarmItem)hander.aryAlarmsi; if (alarm.IsCFPMatch(cfp0, cfp1, cfp2, c
47、fp3)hander.aryAlarms.RemoveAt(i);string strFP = alarm.FP0.ToString() + ":" strFP += alarm.FP1.ToString() + ":" strFP += alarm.FP2.ToString() + ":" strFP += alarm.FP3.ToString();Debug.WriteDebugInfoNoSpe(int)Debug.InfoType.Information,"AlampCmd", DateTime.Now.T
48、oString() + "-清除告警FP:0rn", strFP);if (alarm.IsCriticalAlarm)if (!alarm.Confirmed)SendMsgToClient("L;C;");elseSendMsgToClient("C;");elseif (!alarm.Confirmed)SendMsgToClient("O;D;");elseSendMsgToClient("D;");public void ClearAlarmByFP(uint fp0, uint fp
49、1, uint fp2, uint fp3)lock (hander.aryAlarms)int nCount = hander.aryAlarms.Count; for (int i = nCount - 1; i >= 0; i-)億陽退服專題軟件V2.0 源代碼61-13AlarmItem alarm = (AlarmItem)hander.aryAlarmsi; if (alarm.IsFPMatch(fp0, fp1, fp2, fp3)hander.aryAlarms.RemoveAt(i); if (alarm.IsCriticalAlarm)if (!alarm.Conf
50、irmed)SendMsgToClient("L;C;");elseSendMsgToClient("C;");elseif (!alarm.Confirmed)SendMsgToClient("O;D;");elseSendMsgToClient("D;");break;private AlarmItem ToNewAlarmItem(System.Xml.XmlDocument alarmMsgXmlDoc)System.Xml.XmlNodealarmNode=alarmMsgXmlDoc.SelectSin
51、gleNode("/xml/message/OneRecord"); AlarmItem item = new AlarmItem();item.FP0 = BOCO.APP.Common.Util.Conv.ToUint(alarmNode.Attributes"fp0".Value); item.FP1 = BOCO.APP.Common.Util.Conv.ToUint(alarmNode.Attributes"fp1".Value); item.FP2 = BOCO.APP.Common.Util.Conv.ToUint(al
52、armNode.Attributes"fp2".Value); item.FP3 = BOCO.APP.Common.Util.Conv.ToUint(alarmNode.Attributes"fp3".Value); item.CFP0BOCO.APP.Common.Util.Conv.ToUint(alarmNode.Attributes"c_fp0".Value); item.CFP1BOCO.APP.Common.Util.Conv.ToUint(alarmNode.Attributes"c_fp1".Va
53、lue); item.CFP2BOCO.APP.Common.Util.Conv.ToUint(alarmNode.Attributes"c_fp2".Value); item.CFP3BOCO.APP.Common.Util.Conv.ToUint(alarmNode.Attributes"c_fp3".Value); item.ObjectClass=億陽退服專題軟件V2.0 源代碼61-14BOCO.APP.Common.Util.Conv.ToInt(alarmNode.Attributes"object_class".Val
54、ue); item.ActiveStatusBOCO.APP.Common.Util.Conv.ToInt(alarmNode.Attributes"active_status".Value); item.RedSeverityBOCO.APP.Common.Util.Conv.ToInt(alarmNode.Attributes"redefine_severity".Value); item.Ne_idBOCO.APP.Common.Util.Conv.ToInt(alarmNode.Attributes"int_id".Value
55、); item.OrgTypeBOCO.APP.Common.Util.Conv.ToInt(alarmNode.Attributes"org_type".Value); item.TimeStampBOCO.APP.Common.Util.Conv.ToStr(alarmNode.Attributes"event_time".Value); item.SubAlarmTypeBOCO.APP.Common.Util.Conv.ToInt(alarmNode.Attributes"sub_alarm_type".Value); ite
56、m.AckFlagBOCO.APP.Common.Util.Conv.ToInt(alarmNode.Attributes"ack_flag".Value);=tryalarmNode = alarmMsgXmlDoc.SelectSingleNode("/xml/message"); item.Serial = int.Parse(alarmNode.Attributes"msg_serial".Value);catchitem.Serial = 1;return item;protected void OnMQClosed(str
57、ing strMsg)serviceHandleStatus = ServiceHandleStatus.Stopping;/if (serviceHandleStatus != ServiceHandleStatus.Stopping &&/!timerMQReconnect.Enabled)timerMQReconnect.Interval = 10 * 1000;/ 10s timerMQReconnect.Enabled = true; Debug.WriteDebugInfo(int)Debug.InfoType.Error, "ServiceError","MQ Closed, will reconnect after 10s.");private void timerMQReconnect_Tick(object sender, EventArgs e)bool bOk = InitMQ(true); Debug.WriteDebugInfo(int)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 忻州市靜樂縣2024-2025學年四年級數(shù)學第二學期期末質(zhì)量檢測試題含解析
- IT員工合同保密條款2025年
- 望江縣2025年三年級數(shù)學第二學期期末檢測試題含解析
- 個人動產(chǎn)抵押反擔保借款合同
- 南陽市鎮(zhèn)平縣2025屆四下數(shù)學期末經(jīng)典模擬試題含解析
- 吉林省長春市第二實驗校2025屆初三第一次月考語文試題文試題含解析
- 石渠縣2025年四年級數(shù)學第二學期期末質(zhì)量檢測試題含解析
- 企業(yè)人力資源顧問合同
- 洗滌劑產(chǎn)品購銷合同
- 統(tǒng)編版二年級語文下冊期末測試卷(C)(含答案)
- DB37T 4074-2020 山東省美麗村居建設標準
- DB34∕T 3677-2020 公路橋梁維修與加固質(zhì)量檢驗評定標準
- xxx鎮(zhèn)衛(wèi)生院中醫(yī)藥工作匯報材料課件(PPT 42頁)
- 工作計劃與目標管理講義通用PPT課件
- 預應力混凝土結構設計原理.pptx
- 商業(yè)銀行員工家訪制度
- 英語練習漢譯英100句
- 六年級下冊經(jīng)典誦讀DOC
- 來料檢驗指導書鋁型材
- 工程項目監(jiān)理常用臺賬記錄表格(最新整理)
- Purchase Order模板參考模板
評論
0/150
提交評論