BPM 結案復原的程式碼 | 一等一科技 | UOF2 | 表單簽核

by | 9 月 2, 2025 | 一等一UOF系統, 程式 | 0 comments

Views: 3

這是v27版本透過dnSpy挖出來的,我猜各版本差異應該不大,官方論壇沒開放這段的程式碼,所以只好自己找了一下

結案復原的程式碼

/// <summary>
/// 結案復原
/// </summary>
/// <param name="taskId">表單TaskId</param>
/// <param name="comment">備註</param>
/// <param name="userGuid">執行者Guid</param>
/// <returns>結果訊息</returns>
public string ReturnForm(string taskId, string comment, string userGuid)
{
    var task = new Ede.Uof.WKF.Engine.Task(taskId);
    var uco = new Ede.Uof.WKF.Utility.ResponsibleUCO();

    // 1) 判斷不可復原的情況
    if (task.TaskDs.TB_WKF_TASK_NODE.Rows.Count == 1)
    {
        return "此單為起單即為結案,無法復原!";
    }
    if (uco.CheckLastSignSiteIsReturnToAppicant(taskId))
    {
        return "此單為退回申請者後作廢,無法復原!";
    }

    // 2) 驗證 Trigger (若有設定)
    var validatorGuid = task.CurrentDocument.FormVersion.RETURN_FORM_VALIDATOR_TRIGGER;
    if (!string.IsNullOrEmpty(validatorGuid))
    {
        try
        {
            string validatorStatus = uco.CallValidatorReturnFormTrigger(task.TaskId, validatorGuid);
            var xml = new XmlDocument();
            xml.LoadXml(validatorStatus);

            if (xml.SelectSingleNode("TriggerReturn/Status")?.InnerText != "1")
            {
                var msg = xml.SelectSingleNode("TriggerReturn/Exception")?.InnerText ?? "驗證失敗";
                return "結案復原驗證失敗,原因如下: " + msg;
            }
        }
        catch
        {
            return "表單復原驗證失敗 (執行驗證時發生錯誤)";
        }
    }

    // 3) 執行復原
    var oldApplyResult = task.TaskResult;
    try
    {
        int ret = uco.ReturnForm(taskId);
        if (ret == 0)
        {
            return "表單復原狀態失敗";
        }

        // 狀態變更 Trigger
        var changeGuid = task.CurrentDocument.FormVersion.CHANGE_FORM_RESULT_GUID;
        if (!string.IsNullOrEmpty(changeGuid))
        {
            uco.CallFormTrigger(oldApplyResult, changeGuid, taskId, false);
        }

        // 更新外部任務
        uco.UpdateExternalTask(taskId, -1);

        // 紀錄 Log
        uco.Log_GUID = Guid.NewGuid().ToString();
        uco.User_GUID = userGuid;
        uco.ContentMethod = "2";
        uco.ExecuteTime = UserTime.SetZone(userGuid).GetNowForDb();
        uco.taskId = taskId;
        uco.formVersionId = task.FormVersionId;
        uco.FORM_ID = task.FormId;
        uco.DOC_NBR = task.FormNumber;
        uco.ModifyPrior = ((int)oldApplyResult).ToString();
        uco.ModifyLater = "-1";
        uco.EXECUTE_COMMENT = comment;
        uco.InsertLog(taskId, task.FormVersionId);

        // 發送通知 (例外不影響結果)
        try
        {
            uco.SendMessage("Return", taskId);
        }
        catch { }

        return "表單復原狀態成功";
    }
    catch
    {
        return "表單復原狀態失敗 (執行過程發生例外)";
    }
}

這段怎麼找出來的?

  1. 找張表單用管理者結案復原 可以知道結案復原是帶入 ReturnForm.aspx?taskId={0} 這個頁面(透過瀏覽器F12開發者模式找到的)
  2. 找出這個頁面,知道後端是 ReturnForm.aspx.cs
  3. 使用dnSpy找到 ReturnForm.aspx.cs 這段的程式碼,提示:Ede.Uof.Web.dll ,直接搜ReturnForm 看結果是.ctor
  4. 把程式碼貼去ChatGpt,請它抽出來產生一個Method

0 Comments

Submit a Comment

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *