1. 程式人生 > 其它 >設計模式之單例工廠模式

設計模式之單例工廠模式

// 定義一個定時器類(類名格式:自定義功能名 + _Timer),且繼承H3.SmartForm.Timer類
public class Supervision_Timer: H3.SmartForm.Timer
{
    //構造方法,跟類名保持一致,裡面不必書寫程式碼,但是必須存在
    public Supervision_Timer() { }

    //重寫定時器引擎執行的方法,必須存在,且方法名必須為OnWork,改動
    protected override void OnWork(H3.IEngine engine) {
        TimeSpan ts1 = new TimeSpan(DateTime.Now.Ticks);
        try
        {
            DateTime now = DateTime.Now;
            DateTime startTime = Convert.ToDateTime("08:00:00");//計劃開始時間
            DateTime endTime = Convert.ToDateTime("12:00:00");//計劃完成時間
            AttendanceManagement AttendanceManagement = new AttendanceManagement();
            bool boole = AttendanceManagement.judgeWorkDay(now, engine);

            //定時上班打卡
            if(startTime < now && endTime > now && !boole)
            {

                AttendanceManagement.AttendanceRecord(engine);
            }
            //下班訊息提醒
            DateTime startTime1 = Convert.ToDateTime("19:30:00");//計劃開始時間
            DateTime endTime1 = Convert.ToDateTime("21:00:00");//計劃完成時間
            if(startTime1 < now && endTime1 > now && !boole) 
            {
                ClockinMessage ClockinMessage = new ClockinMessage();
                ClockinMessage.projectPerson(engine);
            }
            TimeSpan ts2 = new TimeSpan(DateTime.Now.Ticks);
            double usedTime = ts1.Subtract(ts2).Duration().TotalSeconds;
            addLogFS(engine, null, usedTime); //寫定時器日誌
        }
        catch(Exception ex)
        {
            TimeSpan ts2 = new TimeSpan(DateTime.Now.Ticks);
            double usedTime = ts1.Subtract(ts2).Duration().TotalSeconds;
            addLogFS(engine, ex, usedTime); //寫定時器日誌
            errorHandlerRemindFS(engine, ex); //定時處理異常提醒
        }
    }

    /*
        在業務程式碼執行完畢後使用
        向定時器日誌新增一行記錄
        入參: 氚雲引擎, 流水號(定時器代號), 異常類(正常處理傳空) , 執行時間
        by: lins, date: 2020-12-02
     */
    private void addLogFS(H3.IEngine engine, Exception ex, double usedTime) {
        H3.DataModel.BizObjectSchema schema = engine.BizObjectManager.GetPublishedSchema("D002033timerLog");
        H3.DataModel.BizObject createBo = new H3.DataModel.BizObject(engine, schema, H3.Organization.User.SystemUserId);
        // createBo["joinFormMenu"] = joinFormMenu;
        // createBo["joinTimerDefinition"] = objectId;
        createBo["usedTime"] = usedTime;
        bool successFlag = true;
        if(ex != null)
        {
            successFlag = false;
            createBo["errorMessage"] = ex.Message;
            createBo["errorStackTrace"] = ex.StackTrace;
        }
        createBo["successFlag"] = successFlag;
        //設定業務物件資料為生效狀態
        createBo.Status = H3.DataModel.BizObjectStatus.Effective;
        createBo.Create();
    }

    /* 
        向定時器管理員傳送定時器處理異常資訊
        入參: 氚雲引擎, 流水號(定時器代號), 異常類
        by: lins, date: 2021-02-25
    */
    private void errorHandlerRemindFS(H3.IEngine engine, Exception ex) {
        // string[] handlers = (string[]) masterBo["errorHandler"];
        List < H3.Notification.UserMessage > messageList=new List<H3.Notification.UserMessage>();

        // for(int i = 0;i < handlers.Length; i++) {
        string title = "定時器報錯處理提醒";//標題
        string context = "定時器: '考勤打卡訊息通知'執行失敗請前往定時器日誌檢視, 出錯資訊: -> " + ex.Message;//傳送內容
        string send = H3.Organization.User.SystemUserId;//發起人
        string receiverid = "8b9de57e-2ebc-4d75-82cf-d891b0b7e09b";//handlers[i] + string.Empty;//接收人
        H3.Notification.UserMessage message = new H3.Notification.UserMessage(H3.Notification.UserMessageType.DingTalkPlainText, send, receiverid, "", title, context, "");
        messageList.Add(message);
        // }
        if(messageList.Count > 0) engine.Notifier.Send(messageList.ToArray());//執行傳送
    }



}