BPM 客製教學(4) 表單 trigger 入門教學2 主表+明細表 | 一等一科技 DLL UOF2 | EIP

by | 10 月 14, 2025 | 一等一UOF系統, 程式 | 0 comments

Views: 3

這篇延續上一篇入門教學 ,在原有表單中增加一個明細表

設計思路

  1. 先把表單建立好+發表
  2. 正常建立一張單,拿到表單的XML(明細那邊建議塞三筆以上的資料)
  3. 請ChatGPT 處理拿XML資料的程式碼

測試Trigger 表單2.0

這邊我們這時增加一個新增表單版本 ,加上一個明細表

Image

同樣到電子簽核 → 表單設計 → 選擇目標表單 → 新增表單版本

Image

選擇從「舊版本複製」→「含表單流程」→ 確定

Image

然後點剛剛新增的版本號 1.01 進入編輯→調整版面

Image

Image

Image

欄位代號跟名稱看自己需求,這邊要先按下確定,才能再回來編輯明細欄位。

Image

點下去明細後

Image

這邊新增4個欄位,請依照自己需求新增。

  1. 項目(單行文字)
  2. 單價(數字)
  3. 數量(數字)
  4. 總計(表單計算,單價x數量)

Image

發佈表單

Image

填一張單 取得XML

Image

上一堂課寫的Trigger直接沿用,直接利用先前在Trigger裡面埋的轉存XML可以在這邊繼續利用它取得表單內容。

填好之後送出

看一下XML長這樣

<Form formVersionId="9992c398-a128-4edc-a13b-5114f6a7b1f6">
  <FormFieldValue>
    <FieldItem fieldId="DOC_NBR" fieldValue="BPM250800002" realValue="" enableSearch="True" />
    <FieldItem fieldId="APPLICICATE" fieldValue="WISH(wish)" realValue="&lt;UserSet&gt;&lt;Element type='user'&gt; &lt;userId&gt;084ecfd9-b65a-4b99-b649-d4abcf03112c&lt;/userId&gt;&lt;/Element&gt;&lt;/UserSet&gt;&#xD;&#xA;" enableSearch="True" />
    <FieldItem fieldId="APPLICICATE_DEPT" fieldValue="RD-T1" realValue="2c3feec0-c47e-b3d2-9b62-053be7cac613,RD-T1,False" enableSearch="True" />
    <FieldItem fieldId="APPLY_DATE" fieldValue="2025/08/22" realValue="" enableSearch="True" fillerName="WISH" fillerUserGuid="084ecfd9-b65a-4b99-b649-d4abcf03112c" fillerAccount="wish" fillSiteId="" />
    <FieldItem fieldId="SINGLE_TEXT" fieldValue="測試明細" realValue="" enableSearch="True" fillerName="WISH" fillerUserGuid="084ecfd9-b65a-4b99-b649-d4abcf03112c" fillerAccount="wish" fillSiteId="" />
    <FieldItem fieldId="DETAILS" enableSearch="True" fillerName="WISH" fillerUserGuid="084ecfd9-b65a-4b99-b649-d4abcf03112c" fillerAccount="wish" fillSiteId="">
      <DataGrid>
        <Row order="0">
          <Cell fieldId="NAME" fieldValue="iPhone 16" realValue="" customValue="" enableSearch="True" />
          <Cell fieldId="PRICE" fieldValue="30000" realValue="" customValue="" enableSearch="True" />
          <Cell fieldId="COUNT" fieldValue="3" realValue="" customValue="" enableSearch="True" />
          <Cell fieldId="SUM" fieldValue="90000" realValue="" customValue="" enableSearch="True" />
        </Row>
        <Row order="1">
          <Cell fieldId="NAME" fieldValue="iPhone 17" realValue="" customValue="" enableSearch="True" />
          <Cell fieldId="PRICE" fieldValue="40000" realValue="" customValue="" enableSearch="True" />
          <Cell fieldId="COUNT" fieldValue="9" realValue="" customValue="" enableSearch="True" />
          <Cell fieldId="SUM" fieldValue="360000" realValue="" customValue="" enableSearch="True" />
        </Row>
        <Row order="2">
          <Cell fieldId="NAME" fieldValue="iMac" realValue="" customValue="" enableSearch="True" />
          <Cell fieldId="PRICE" fieldValue="60000" realValue="" customValue="" enableSearch="True" />
          <Cell fieldId="COUNT" fieldValue="6" realValue="" customValue="" enableSearch="True" />
          <Cell fieldId="SUM" fieldValue="360000" realValue="" customValue="" enableSearch="True" />
        </Row>
      </DataGrid>
    </FieldItem>
  </FormFieldValue>
</Form>

這邊可以看到,系統東西是包在 <DataGrid></DataGrid>

另一種取得XML的方式 從資料庫的資料表

讀取已經送出的表單 TB_WKF_TASK

SELECT TOP (10) CURRENT_DOC FROM [dbo].[TB_WKF_TASK] ORDER BY BEGIN_TIME DESC

通常我會送出一筆資料,透過上述SQL會把最新一筆排在最上面,從CURRENT_DOC拿到表單資料

讀取草稿 TB_WKF_SCRIPT

SELECT TOP (10) [CONTENT]  FROM [dbo].[TB_WKF_SCRIPT]  ORDER BY MODIFY_TIME DESC

不送出表單也可以,只要儲存草稿就能拿到表單資料,這個SQL會把最新一筆排在最上面,從CONTENT拿到表單資料

設計資料表主表-明細

  • 主表,這個我們直接沿用上一個範例的Z_TEST_TRIGGER
  • 明細表:我們簡單命名就好明細表Z_TEST_TRIGGER_D1

這邊照同樣把明細表的欄位定義寫入資料表

重點來了要將表單的DOC_NBR+SEQ欄位同時選起來(按下CTRL+滑鼠點),接著滑鼠按右鍵,按下Set Primary Key(設定為主鍵)

設定好之後將資料表存檔關閉

重新整理SSMS的資料庫後,應該可以看到最新的資料表在底下

建立Z_TEST_TRIGGER_D1 的MODEL

先將資料表的資料模型新增為一個類別,這個做法稱為建立model,Z_TEST_TRIGGER_D1.cs

建立好Z_TEST_TRIGGER_D1.cs後,內容如下

  1. 順序SEQ ,型態int
  2. 跟錢有關的,型態decimal
  3. 數量,型態int
  4. 字串類,型態string
namespace UOF_DEV
{
    /// <summary>
    /// 測試用的表單-明細 對應資料表 Z_TEST_TRIGGER_D1
    /// </summary>
    public class Z_TEST_TRIGGER_D1
    {
        /// <summary>
        /// 表單編號
        /// </summary>
        public string DOC_NBR { get; set; }

        /// <summary>
        /// 順序
        /// </summary>
        public int SEQ { get; set; } 

        /// <summary>
        /// 品名
        /// </summary>
        public string NAME { get; set; }

        /// <summary>
        /// 單價
        /// </summary>
        public decimal? PRICE { get; set; }

        /// <summary>
        /// 數量
        /// </summary>
        public int? COUNT { get; set; }

        /// <summary>
        /// 總計
        /// </summary>

        public decimal? SUM { get; set; }
    }
}

修改Trigger的Insert部分

邊用一個比較偷懶的方式 刪除再新增,不過建議實作還是要用 Update的方式進行新增,這邊為了教學方便取巧

這邊加入子表的刪除與新增,並且在輸入函數增加子表的部分

 /// <summary>
 /// 新增或更新資料到 Z_TEST_TRIGGER 資料表
 /// </summary>
 /// <param name="model"></param>
 public void Insert(Z_TEST_TRIGGER model,List<Z_TEST_TRIGGER_D1>  detail)
 {
     //這邊用一個比較偷懶的方式 刪除再新增,不過建議實作還是要用 Update的方式進行新增,這邊為了教學方便取巧

     //主表的SQL指令
     string sql = @"
         DELETE FROM Z_TEST_TRIGGER WHERE DOC_NBR = @DOC_NBR;                
         INSERT INTO Z_TEST_TRIGGER (DOC_NBR, APPLICICATE, APPLICICATE_DEPT, APPLY_DATE, SINGLE_TEXT, TASK_STATUS, TASK_RESULT)
                     VALUES (@DOC_NBR, @APPLICICATE, @APPLICICATE_DEPT, @APPLY_DATE, @SINGLE_TEXT, @TASK_STATUS, @TASK_RESULT)";

     //明細的SQL指令(新增)
     string sqlDelD1 = @"DELETE FROM Z_TEST_TRIGGER_D1 WHERE DOC_NBR = @DOC_NBR;";
     string sqlInsertD1 = @"
         INSERT INTO Z_TEST_TRIGGER_D1 (DOC_NBR, SEQ, NAME, PRICE, COUNT, SUM)
             VALUES (@DOC_NBR, @SEQ, @NAME, @PRICE, @COUNT, @SUM)";
     //將資料寫入資料庫
     using (var conn = new SqlConnection(_connectionString))
     {
         conn.Open();
         var transaction = conn.BeginTransaction();
         try
         {
             conn.Execute(sql, model , transaction);
             //處理明細(新增這兩行)
             conn.Execute(sqlDelD1, new { model.DOC_NBR }, transaction);
             conn.Execute(sqlInsertD1, detail, transaction);
             transaction.Commit();
         }
         catch (Exception)
         {
             transaction.Rollback();
             throw;
         }
     }
 }

新增XML讀取資料表的部分的部分

這邊做幾件事

  1. 將XML的結構更新到程式碼當中,如果你有安裝Copilot系統就會自動更新它
  2. 將XML內容讀取成一個List
public string GetFormResult(ApplyTask applyTask)
{
    //取得表單編號
    string DOC_NBR = applyTask.FormNumber;

    //將目前表單內容讀到 doc物件當中
    XmlDocument doc = new XmlDocument();
    doc.LoadXml(applyTask.CurrentDocXML);

    //建立儲存表單的目錄
    System.IO.Directory.CreateDirectory("C:\\UOF_DEBUG\\");
    //儲存表單xml內容到硬碟中
    doc.Save($"C:\\UOF_DEBUG\\{DOC_NBR}{DateTime.Now:yyyy-MM-dd-hh-mm-ss}.xml");

    /*XML SAMPLE(這邊有更新)
     <Form formVersionId="9992c398-a128-4edc-a13b-5114f6a7b1f6">
          <FormFieldValue>
            <FieldItem fieldId="DOC_NBR" fieldValue="BPM250800002" realValue="" enableSearch="True" />
            <FieldItem fieldId="APPLICICATE" fieldValue="WISH(wish)" realValue="&lt;UserSet&gt;&lt;Element type='user'&gt; &lt;userId&gt;084ecfd9-b65a-4b99-b649-d4abcf03112c&lt;/userId&gt;&lt;/Element&gt;&lt;/UserSet&gt;&#xD;&#xA;" enableSearch="True" />
            <FieldItem fieldId="APPLICICATE_DEPT" fieldValue="RD-T1" realValue="2c3feec0-c47e-b3d2-9b62-053be7cac613,RD-T1,False" enableSearch="True" />
            <FieldItem fieldId="APPLY_DATE" fieldValue="2025/08/22" realValue="" enableSearch="True" fillerName="WISH" fillerUserGuid="084ecfd9-b65a-4b99-b649-d4abcf03112c" fillerAccount="wish" fillSiteId="" />
            <FieldItem fieldId="SINGLE_TEXT" fieldValue="測試明細" realValue="" enableSearch="True" fillerName="WISH" fillerUserGuid="084ecfd9-b65a-4b99-b649-d4abcf03112c" fillerAccount="wish" fillSiteId="" />
            <FieldItem fieldId="DETAILS" enableSearch="True" fillerName="WISH" fillerUserGuid="084ecfd9-b65a-4b99-b649-d4abcf03112c" fillerAccount="wish" fillSiteId="">
              <DataGrid>
                <Row order="0">
                  <Cell fieldId="NAME" fieldValue="iPhone 16" realValue="" customValue="" enableSearch="True" />
                  <Cell fieldId="PRICE" fieldValue="30000" realValue="" customValue="" enableSearch="True" />
                  <Cell fieldId="COUNT" fieldValue="3" realValue="" customValue="" enableSearch="True" />
                  <Cell fieldId="SUM" fieldValue="90000" realValue="" customValue="" enableSearch="True" />
                </Row>
                <Row order="1">
                  <Cell fieldId="NAME" fieldValue="iPhone 17" realValue="" customValue="" enableSearch="True" />
                  <Cell fieldId="PRICE" fieldValue="40000" realValue="" customValue="" enableSearch="True" />
                  <Cell fieldId="COUNT" fieldValue="9" realValue="" customValue="" enableSearch="True" />
                  <Cell fieldId="SUM" fieldValue="360000" realValue="" customValue="" enableSearch="True" />
                </Row>
                <Row order="2">
                  <Cell fieldId="NAME" fieldValue="iMac" realValue="" customValue="" enableSearch="True" />
                  <Cell fieldId="PRICE" fieldValue="60000" realValue="" customValue="" enableSearch="True" />
                  <Cell fieldId="COUNT" fieldValue="6" realValue="" customValue="" enableSearch="True" />
                  <Cell fieldId="SUM" fieldValue="360000" realValue="" customValue="" enableSearch="True" />
                </Row>
              </DataGrid>
            </FieldItem>
          </FormFieldValue>
        </Form>
     */
    var model = new Z_TEST_TRIGGER
    {
        DOC_NBR = GetFieldValue(doc, "DOC_NBR"),
        APPLICICATE = GetFieldValue(doc, "APPLICICATE"),
        APPLICICATE_DEPT = GetFieldValue(doc, "APPLICICATE_DEPT"),
        APPLY_DATE = TryParseDateTime(GetFieldValue(doc, "APPLY_DATE")) ?? DateTime.Now,
        SINGLE_TEXT = GetFieldValue(doc, "SINGLE_TEXT"),
        TASK_STATUS = GetFormTaskStatus(applyTask),
        TASK_RESULT = GetFormTaskResult(applyTask)
    };
    var details = new List<Z_TEST_TRIGGER_D1>();
    //處理明細資料 讀取 DataGrid 內容(這邊有更新)
    //取得 DETAILS 明細的 DataGrid 節點(這邊使用copilot產生的)
    var detailNode = doc.SelectSingleNode($"//FieldItem[@fieldId='DETAILS']/DataGrid");
    if (detailNode != null) {
        var rows = detailNode.SelectNodes("Row");
        if (rows != null)
        {
            foreach (XmlNode row in rows)
            {
                var detail = new Z_TEST_TRIGGER_D1
                {
                    DOC_NBR = model.DOC_NBR,
                    SEQ = int.TryParse(row.Attributes["order"]?.Value, out int seq) ? seq + 1 : 0,
                    NAME = row.SelectSingleNode("Cell[@fieldId='NAME']")?.Attributes["fieldValue"]?.Value,
                    PRICE = decimal.TryParse(row.SelectSingleNode("Cell[@fieldId='PRICE']")?.Attributes["fieldValue"]?.Value, out decimal price) ? price : (decimal?)null,
                    COUNT = int.TryParse(row.SelectSingleNode("Cell[@fieldId='COUNT']")?.Attributes["fieldValue"]?.Value, out int count) ? count : (int?)null,
                    SUM = decimal.TryParse(row.SelectSingleNode("Cell[@fieldId='SUM']")?.Attributes["fieldValue"]?.Value, out decimal sum) ? sum : (decimal?)null,
                };
                details.Add(detail);
            }
        }
    }

    Insert(model,details); //(這邊有更新)
    //故意失敗,用於重複測試使用
    throw new Exception("For TEST");

    return "";
}

存檔編譯

TRIGGER 務必編譯後再進行測試

測試

測試方法很簡單,一樣新起一張單,然後送出,再去看資料表

常見的幾個問題點

沒出現任何錯誤,但資料庫也沒資料

看一下呼叫DLL

找到表單,查詢,通常有錯誤會在這邊,如果沒任何錯誤就是這張表沒設定起單要呼叫的DLL

到表單設計>該表單>維護表單

看一下這邊設定是不是漏掉了

主表有資料,明細沒有資料

這個範例使用的是交易模式,如果主表有資料,明細沒資料的狀態,代表你的DLL沒編譯最新的給它,這時回到Visual Studio的專案,按下建置(Build),再重新起單一次。

本範例Trigger的完整程式碼

using Ede.Uof.Utility.Data;
using Ede.Uof.WKF.Engine;
using Ede.Uof.WKF.ExternalUtility;
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Xml;
using Dapper;

namespace UOF_DEV
{
    public class Trigger : ICallbackTriggerPlugin
    {
        /// <summary>
        /// 連線字串
        /// </summary>
        private string _connectionString;

        /// <summary>
        /// 建構子
        /// </summary>
        public Trigger()
        {
            //EIP內建抓取得連線字串
            _connectionString = new DatabaseHelper().Command.Connection.ConnectionString; 
        }
        public void Finally()
        {
            
        }

        public string GetFormResult(ApplyTask applyTask)
        {
            //取得表單編號
            string DOC_NBR = applyTask.FormNumber;

            //將目前表單內容讀到 doc物件當中
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(applyTask.CurrentDocXML);

            //建立儲存表單的目錄
            System.IO.Directory.CreateDirectory("C:\\UOF_DEBUG\\");
            //儲存表單xml內容到硬碟中
            doc.Save($"C:\\UOF_DEBUG\\{DOC_NBR}{DateTime.Now:yyyy-MM-dd-hh-mm-ss}.xml");

            /*XML SAMPLE
             <Form formVersionId="9992c398-a128-4edc-a13b-5114f6a7b1f6">
                  <FormFieldValue>
                    <FieldItem fieldId="DOC_NBR" fieldValue="BPM250800002" realValue="" enableSearch="True" />
                    <FieldItem fieldId="APPLICICATE" fieldValue="WISH(wish)" realValue="&lt;UserSet&gt;&lt;Element type='user'&gt; &lt;userId&gt;084ecfd9-b65a-4b99-b649-d4abcf03112c&lt;/userId&gt;&lt;/Element&gt;&lt;/UserSet&gt;&#xD;&#xA;" enableSearch="True" />
                    <FieldItem fieldId="APPLICICATE_DEPT" fieldValue="RD-T1" realValue="2c3feec0-c47e-b3d2-9b62-053be7cac613,RD-T1,False" enableSearch="True" />
                    <FieldItem fieldId="APPLY_DATE" fieldValue="2025/08/22" realValue="" enableSearch="True" fillerName="WISH" fillerUserGuid="084ecfd9-b65a-4b99-b649-d4abcf03112c" fillerAccount="wish" fillSiteId="" />
                    <FieldItem fieldId="SINGLE_TEXT" fieldValue="測試明細" realValue="" enableSearch="True" fillerName="WISH" fillerUserGuid="084ecfd9-b65a-4b99-b649-d4abcf03112c" fillerAccount="wish" fillSiteId="" />
                    <FieldItem fieldId="DETAILS" enableSearch="True" fillerName="WISH" fillerUserGuid="084ecfd9-b65a-4b99-b649-d4abcf03112c" fillerAccount="wish" fillSiteId="">
                      <DataGrid>
                        <Row order="0">
                          <Cell fieldId="NAME" fieldValue="iPhone 16" realValue="" customValue="" enableSearch="True" />
                          <Cell fieldId="PRICE" fieldValue="30000" realValue="" customValue="" enableSearch="True" />
                          <Cell fieldId="COUNT" fieldValue="3" realValue="" customValue="" enableSearch="True" />
                          <Cell fieldId="SUM" fieldValue="90000" realValue="" customValue="" enableSearch="True" />
                        </Row>
                        <Row order="1">
                          <Cell fieldId="NAME" fieldValue="iPhone 17" realValue="" customValue="" enableSearch="True" />
                          <Cell fieldId="PRICE" fieldValue="40000" realValue="" customValue="" enableSearch="True" />
                          <Cell fieldId="COUNT" fieldValue="9" realValue="" customValue="" enableSearch="True" />
                          <Cell fieldId="SUM" fieldValue="360000" realValue="" customValue="" enableSearch="True" />
                        </Row>
                        <Row order="2">
                          <Cell fieldId="NAME" fieldValue="iMac" realValue="" customValue="" enableSearch="True" />
                          <Cell fieldId="PRICE" fieldValue="60000" realValue="" customValue="" enableSearch="True" />
                          <Cell fieldId="COUNT" fieldValue="6" realValue="" customValue="" enableSearch="True" />
                          <Cell fieldId="SUM" fieldValue="360000" realValue="" customValue="" enableSearch="True" />
                        </Row>
                      </DataGrid>
                    </FieldItem>
                  </FormFieldValue>
                </Form>
             */
            var model = new Z_TEST_TRIGGER
            {
                DOC_NBR = GetFieldValue(doc, "DOC_NBR"),
                APPLICICATE = GetFieldValue(doc, "APPLICICATE"),
                APPLICICATE_DEPT = GetFieldValue(doc, "APPLICICATE_DEPT"),
                APPLY_DATE = TryParseDateTime(GetFieldValue(doc, "APPLY_DATE")) ?? DateTime.Now,
                SINGLE_TEXT = GetFieldValue(doc, "SINGLE_TEXT"),
                TASK_STATUS = GetFormTaskStatus(applyTask),
                TASK_RESULT = GetFormTaskResult(applyTask)
            };
            var details = new List<Z_TEST_TRIGGER_D1>();
            //處理明細資料 讀取 DataGrid 內容
            //取得 DETAILS 明細的 DataGrid 節點(這邊使用copilot產生的)
            var detailNode = doc.SelectSingleNode($"//FieldItem[@fieldId='DETAILS']/DataGrid");
            if (detailNode != null) {
                var rows = detailNode.SelectNodes("Row");
                if (rows != null)
                {
                    foreach (XmlNode row in rows)
                    {
                        var detail = new Z_TEST_TRIGGER_D1
                        {
                            DOC_NBR = model.DOC_NBR,
                            SEQ = int.TryParse(row.Attributes["order"]?.Value, out int seq) ? seq + 1 : 0,
                            NAME = row.SelectSingleNode("Cell[@fieldId='NAME']")?.Attributes["fieldValue"]?.Value,
                            PRICE = decimal.TryParse(row.SelectSingleNode("Cell[@fieldId='PRICE']")?.Attributes["fieldValue"]?.Value, out decimal price) ? price : (decimal?)null,
                            COUNT = int.TryParse(row.SelectSingleNode("Cell[@fieldId='COUNT']")?.Attributes["fieldValue"]?.Value, out int count) ? count : (int?)null,
                            SUM = decimal.TryParse(row.SelectSingleNode("Cell[@fieldId='SUM']")?.Attributes["fieldValue"]?.Value, out decimal sum) ? sum : (decimal?)null,
                        };
                        details.Add(detail);
                    }
                }
            }

            Insert(model,details);
            //故意失敗,用於重複測試使用
            throw new Exception("For TEST");

            return "";
        }

        /// <summary>
        /// 新增或更新資料到 Z_TEST_TRIGGER 資料表
        /// </summary>
        /// <param name="model"></param>
        public void Insert(Z_TEST_TRIGGER model,List<Z_TEST_TRIGGER_D1>  detail)
        {
            //這邊用一個比較偷懶的方式 刪除再新增,不過建議實作還是要用 Update的方式進行新增,這邊為了教學方便取巧

            //主表的SQL指令
            string sql = @"
                DELETE FROM Z_TEST_TRIGGER WHERE DOC_NBR = @DOC_NBR;                
                INSERT INTO Z_TEST_TRIGGER (DOC_NBR, APPLICICATE, APPLICICATE_DEPT, APPLY_DATE, SINGLE_TEXT, TASK_STATUS, TASK_RESULT)
                            VALUES (@DOC_NBR, @APPLICICATE, @APPLICICATE_DEPT, @APPLY_DATE, @SINGLE_TEXT, @TASK_STATUS, @TASK_RESULT)";

            //明細的SQL指令
            string sqlDelD1 = @"DELETE FROM Z_TEST_TRIGGER_D1 WHERE DOC_NBR = @DOC_NBR;";
            string sqlInsertD1 = @"
                INSERT INTO Z_TEST_TRIGGER_D1 (DOC_NBR, SEQ, NAME, PRICE, COUNT, SUM)
                    VALUES (@DOC_NBR, @SEQ, @NAME, @PRICE, @COUNT, @SUM)";
            //將資料寫入資料庫
            using (var conn = new SqlConnection(_connectionString))
            {
                conn.Open();
                var transaction = conn.BeginTransaction();
                try
                {
                    conn.Execute(sql, model , transaction);
                    //處理明細
                    conn.Execute(sqlDelD1, new { model.DOC_NBR }, transaction);
                    conn.Execute(sqlInsertD1, detail, transaction);
                    transaction.Commit();
                }
                catch (Exception)
                {
                    transaction.Rollback();
                    throw;
                }
            }
        }

        public void OnError(Exception errorException)
        {
            
        }

        /// <summary>
        /// 取得BPM表單中 FieldValue 的內容
        /// </summary>
        /// <param name="doc"></param>
        /// <param name="fieldId"></param>
        /// <returns></returns>
        private string GetFieldValue(XmlDocument doc, string fieldId)
        {
            return doc.SelectSingleNode($"//FieldItem[@fieldId='{fieldId}']")?.Attributes["fieldValue"]?.Value;
        }

        /// <summary>
        /// 取得BPM表單中 RealValue 的內容
        /// </summary>
        /// <param name="doc">表單XML</param>
        /// <param name="fieldId">欄位名稱</param>
        /// <returns></returns>
        private string GerRealValue(XmlDocument doc, string fieldId)
        {
            return doc.SelectSingleNode($"//FieldItem[@fieldId='{fieldId}']")?.Attributes["realValue"]?.Value;
        }

        /// <summary>
        /// 字串轉DateTime
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        private DateTime? TryParseDateTime(string value)
        {
            if (DateTime.TryParse(value, out DateTime result))
                return result;
            return null;
        }

        /// <summary>
        ///表單狀態
        /// </summary>
        /// <param name="applyTask">
        /// </param>
        /// <returns>
        /// 1 = 處理中
        /// 2 = 結案
        /// 3 = 異常
        /// 4 = 退回
        /// </returns>
        public static string GetFormTaskStatus(ApplyTask applyTask)
        {
            try
            {
                // 結案
                // 如果 TaskStatus 不是 Active,返回 "2結案"
                if (applyTask.Task.TaskStatus != ActiveStatus.Active)
                {
                    return "2";
                }

                //退回申請者
                // 檢查 SignResult 為 ReturnToAppliant 退回申請者 且 TaskStatus 為 Active,返回 "4退回"
                if (applyTask.SignResult == SignResult.ReturnToAppliant &&
                    applyTask.Task.TaskStatus == ActiveStatus.Active)
                {
                    return "4";
                }

                // 退回某人
                // 檢查 SignResult 為 Return 且 TaskStatus 為 Active,返回 "1處理中"
                if (applyTask.SignResult == SignResult.Return && applyTask.Task.TaskStatus == ActiveStatus.Active)
                {
                    return "1";
                }

                // 檢查 SignResult 為 GetBack 且 TaskStatus 為 Active,返回 "4退回"
                if (applyTask.SignResult == SignResult.GetBack && applyTask.Task.TaskStatus == ActiveStatus.Active)
                {
                    return "4";
                }

                // 檢查 SignResult 為 Approve 且 TaskStatus 為 ReturnToApplicant,返回 "1處理中"
                if (applyTask.SignResult == SignResult.Approve &&
                    applyTask.Task.TaskStatus == ActiveStatus.ReturnToApplicant)
                {
                    return "1";
                }

                // 檢查 SignResult 為 Disapprove 且 TaskStatus 為 Active,返回 "2結案"
                if (applyTask.SignResult == SignResult.Disapprove && applyTask.Task.TaskStatus == ActiveStatus.Active)
                {
                    return "2";
                }

                // 如果沒有匹配條件,返回 "1處理中"
                return "1";
            }
            catch
            {
                // 如果發生異常,返回 "3異常"
                return "3";
            }
        }

        /// <summary>
        /// 取得表單的申請結果
        /// </summary>
        /// <param name="applyTask">The apply task.</param>
        /// <returns>0核准, 1否決, 2作廢,3退回, NULL 簽核中</returns>
        public static string GetFormTaskResult(ApplyTask applyTask)
        {
            return applyTask.FormResult == ApplyResult.UnKnow ? null : ((int)applyTask.FormResult).ToString();
        }
    }
}

    0 Comments

    Submit a Comment

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