App007 router說明

APP007 router說明:
程式名稱: APP007Controller.cs
這段程式碼是 ASP.NET Core 中的 Controller 類別,用於處理名為 APP007 的 Web API 相關請求。這個 Controller 類別提供了各種 API 端點,以便進行檔案格式查詢、批號檢查、作業執行、維護視窗查詢及維護作業等功能。下面逐段解釋這段程式碼:

1. APP007Controller 類別

這個類別繼承自 BaseController,並使用了 ASP.NET Core 的 API 控制器特性 [ApiController] 和路由特性 [Route("api/[controller]")]。這意味著該控制器的所有端點都會以 api/APP007 為基礎路由。

2. 建構子

1
2
3
4
5
public APP007Controller(APP007Service service, CommonService commonService, ILogger<APP007Controller> logger) : base(logger)
{
_service = service;
_commonService = commonService;
}
  • APP007Controller 類別的建構子接收三個參數:APP007ServiceCommonServiceILogger<APP007Controller>
  • APP007ServiceCommonService 是業務邏輯層的服務,ILogger 用於記錄日誌。
  • base(logger) 呼叫父類別 BaseController 的建構子。

3. 下拉選單 => 檔案格式

1
2
3
[Route("GetFileTypePercentList")]
[HttpGet]
public ApiResult<List<SysParm_OutputVo>> GetFileTypePercentListResult()
  • 這個端點使用 GET 請求來獲取檔案格式的下拉選單數據。

  • 調用 _commonService.GetFileTypePercentListResult() 獲取檔案格式列表。 Table為 : SYS_PARM_D

  • 根據返回的狀態設置 ApiResultRESULT_CODERESULT_MESSAGE

  • 程式碼:

    1
    2
    3
    4
    public List<SYS_PARM_D> QueryByParmId(string PARM_ID)
    {
    return _repository.Connection().Query<SYS_PARM_D>(@$"SELECT * FROM SYS_PARM_D WHERE PARM_ID = '{PARM_ID}' ").ToList();
    }

    程式碼:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    #region 檢查批號並取得檔案名稱
    public ServiceResult<OpenCheckSeq_OutputVo> CheckOpenCheckSeqResult(OpenCheckSeq_InputVo inputVo)
    {
    ServiceResult<OpenCheckSeq_OutputVo> serviceResult = new ServiceResult<OpenCheckSeq_OutputVo>();

    try
    {
    OpenCheckSeq_OutputVo result = new OpenCheckSeq_OutputVo();

    //先檢查批號是否存在
    var rtn = _nP_DETAILDao.HasOpenCheckSeq(inputVo.P_OPEN_CHECK_SEQ);
    if (!rtn)
    {
    serviceResult.status = CommonEnum.ACTION_STATUS.NOTFOUND;
    serviceResult.message = string.Format(SysMessage.B0010003, "批號");
    } else
    {
    //有批號再檢查單據是否存在
    var document_no = _nP_DETAILDao.QueryDocumentNo(this.CompanyId, inputVo.P_OPEN_CHECK_SEQ);
    if (string.IsNullOrEmpty(document_no))
    {
    serviceResult.status = CommonEnum.ACTION_STATUS.NOTFOUND;
    serviceResult.message = string.Format(SysMessage.B0010003, "單據號碼");
    }
    else
    {
    result.P_FILENAME_1 = inputVo.P_OPEN_CHECK_SEQ + "加密-" + document_no + ".TXT";
    result.P_FILENAME_2 = inputVo.P_OPEN_CHECK_SEQ + "-" + document_no + ".TXT";
    serviceResult.status = CommonEnum.ACTION_STATUS.SUCCESS;
    serviceResult.message = SysMessage.S0100001;
    serviceResult.result = result;
    }
    }
    }
    catch (Exception ex)
    {
    serviceResult.status = CommonEnum.ACTION_STATUS.FAILURE;
    serviceResult.message = ex.Message;
    serviceResult.ex = ex;
    }

    return serviceResult;
    }
    #endregion

4. 檢查批號並取得檔案名稱

1
2
3
[Route("CheckOpenCheckSeq")]
[HttpPost]
public ApiResult<OpenCheckSeq_OutputVo> CheckOpenCheckSeq(OpenCheckSeq_InputVo inputVo)
  • 這個端點使用 POST 請求來檢查批號並取得檔案名稱。
    CheckOpenCheckSeqResult 方法的目的是驗證提供的批號是否存在,
    並根據批號查詢相關的單據號碼,最終生成檔案名稱。
    如果批號或單據號碼不存在,方法會返回相應的錯誤信息。

CheckOpenCheckSeqResult 方法中生成的兩個檔案名稱 P_FILENAME_1P_FILENAME_2 是基於批號和單據號碼創建的檔案名稱。這些檔案名稱通常用於後續的文件處理或保存操作,具體用途取決於應用的業務邏輯。讓我們詳細看看這兩個檔案名稱的格式和含義:

檔案名稱格式

  1. P_FILENAME_1:

    1
    result.P_FILENAME_1 = inputVo.P_OPEN_CHECK_SEQ + "加密-" + document_no + ".TXT";
    • 格式: 批號 + "加密-" + 單據號碼 + ".TXT"
    • 示例: 20230920加密-12345.TXT
    • 用途: 這個檔案名稱可能用於表示一個經過加密處理的檔案。批號和單據號碼組合在一起,用於唯一標識這個檔案。
  2. P_FILENAME_2:

    1
    result.P_FILENAME_2 = inputVo.P_OPEN_CHECK_SEQ + "-" + document_no + ".TXT";
    • 格式: 批號 + "-" + 單據號碼 + ".TXT"
    • 示例: 20230920-12345.TXT
    • 用途: 這個檔案名稱可能用於表示原始或未經加密處理的檔案。它直接包含批號和單據號碼。

這些檔案的潛在用途

  1. 檔案加密和儲存:

    • P_FILENAME_1 可能是加密後的檔案,這意味著在生成這個檔案名稱後,系統可能會對檔案進行加密處理以保護其內容。
  2. 文件處理和記錄:

    • P_FILENAME_2 可能是用於保存未加密的檔案或作為記錄用途的檔案名稱。這些檔案名稱可以幫助在系統中唯一標識文件,並進行後續的檔案處理操作。
  3. 資料備份:

    • 這些檔案名稱可能用於資料備份或報告生成,幫助系統根據批號和單據號碼生成對應的檔案,並進行系統內部的資料管理。

總的來說,P_FILENAME_1P_FILENAME_2 是根據業務需求生成的檔案名稱,用於文件處理、加密和記錄等目的。具體的用途會根據應用的具體實現和業務需求來決定。

  • 調用 _service.CheckOpenCheckSeqResult(inputVo) 獲取結果。
  • 根據返回的狀態設置 ApiResultRESULT_CODERESULT_MESSAGE
    程式碼:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    #region 檢查批號並取得檔案名稱
    public ServiceResult<OpenCheckSeq_OutputVo> CheckOpenCheckSeqResult(OpenCheckSeq_InputVo inputVo)
    {
    ServiceResult<OpenCheckSeq_OutputVo> serviceResult = new ServiceResult<OpenCheckSeq_OutputVo>();

    try
    {
    OpenCheckSeq_OutputVo result = new OpenCheckSeq_OutputVo();

    //先檢查批號是否存在
    var rtn = _nP_DETAILDao.HasOpenCheckSeq(inputVo.P_OPEN_CHECK_SEQ);
    if (!rtn)
    {
    serviceResult.status = CommonEnum.ACTION_STATUS.NOTFOUND;
    serviceResult.message = string.Format(SysMessage.B0010003, "批號");
    } else
    {
    //有批號再檢查單據是否存在
    var document_no = _nP_DETAILDao.QueryDocumentNo(this.CompanyId, inputVo.P_OPEN_CHECK_SEQ);
    if (string.IsNullOrEmpty(document_no))
    {
    serviceResult.status = CommonEnum.ACTION_STATUS.NOTFOUND;
    serviceResult.message = string.Format(SysMessage.B0010003, "單據號碼");
    }
    else
    {
    result.P_FILENAME_1 = inputVo.P_OPEN_CHECK_SEQ + "加密-" + document_no + ".TXT";
    result.P_FILENAME_2 = inputVo.P_OPEN_CHECK_SEQ + "-" + document_no + ".TXT";
    serviceResult.status = CommonEnum.ACTION_STATUS.SUCCESS;
    serviceResult.message = SysMessage.S0100001;
    serviceResult.result = result;
    }
    }
    }
    catch (Exception ex)
    {
    serviceResult.status = CommonEnum.ACTION_STATUS.FAILURE;
    serviceResult.message = ex.Message;
    serviceResult.ex = ex;
    }

    return serviceResult;
    }
    #endregion

5. 執行 作業

1
2
3
4
[Route("ExportPaymentFile")]
[HttpPost]
[Authorize]
public async Task<ApiResult<APP007_OutputVo>> ExportPaymentFile([FromBody] APP007_InputVo inputVo)
  • 這個端點使用 POST 請求來執行作業,並且要求授權 [Authorize]

  • 調用 _service.ExportPaymentFileResult(inputVo) 獲取結果。

  • 根據返回的狀態設置 ApiResultRESULT_CODERESULT_MESSAGE

生成的檔案

ExportPaymentFileResult 方法中,生成了兩個檔案名稱:

  1. 主檔 (fileName): 由 FileExportHelper.CreateFileFromList 方法生成,根據 paymentData 列表內容產生的 TXT 檔案。
  2. 加密檔案: 由 DoEncryptionDoEncryptionCUB 方法對主檔進行加密處理後生成。

6. 維護視窗 查詢

1
2
3
4
[Route("Query")]
[HttpPost]
[Authorize]
public ApiResult<List<APP007Q_OutputVo>> Post([FromBody] APP007Q_InputVo inputVo)
  • 這個端點使用 POST 請求來查詢維護視窗的數據,並且要求授權 [Authorize]
  • 調用 _service.QueryResult(inputVo) 獲取結果。
  • 根據返回的狀態設置 ApiResultRESULT_CODERESULT_MESSAGE
  • 透過 _dao.Query(inputVo) 執行查詢,並將結果儲存在 list 中。
    如果查詢到結果,則回傳成功狀態並記錄結果;如果查詢不到資料,則回傳「查無資料」的訊息。

7. 維護視窗 維護 作業

1
2
3
4
[Route("Edit")]
[HttpPut]
[Authorize]
public ApiResult<int> Edit([FromBody]
- 這個端點使用 `PUT` 請求來執行維護視窗的維護作業,並且要求授權 `[Authorize]`。
- 調用 `_service.EditResult(inputVoList)` 獲取結果。
- 根據返回的狀態設置 `ApiResult` 的 `RESULT_CODE` 和 `RESULT_MESSAGE`。
- 使用兩層 for 迴圈處理多筆資料。第一層迴圈遍歷 inputVoList 中的每一筆資料,
第二層迴圈處理 BLOCK_DETAIL 裡的每一筆明細。
**更新與刪除操作:**
- 在 `BLOCK_DETAIL` 的明細中,根據 `_MARK()` 的值來決定當前明細需要更新 (`UPDATE`) 還是刪除 (`DELETE`):
    - 如果是更新操作 (`UPDATE`),會呼叫 `_aPP017_DETAILDao.Update()` 方法,並檢查結果是否為 1。如果失敗,則記錄錯誤訊息並將 `status` 設為 `false`。
    - 如果是刪除操作 (`DELETE`),則呼叫 `_aPP017_DETAILDao.DeleteByRowid()` 方法,並檢查結果是否為 1。如果失敗,則同樣記錄錯誤訊息並將 `status` 設為 `false`。
-    - 如果所有操作成功 (`status == true`),將提交交易 `_dao.Commit()`,並將成功訊息和處理的筆數記錄在 `serviceResult` 中。
    - 如果有任意一筆失敗,則會回滾操作 `_dao.RollBack()`,並回傳錯誤訊息。

8. 維護視窗 加密 作業

1
2
3
4
[Route("Encryption")]
[HttpPost]
[Authorize]
public async Task<ApiResult<APP007_OutputVo>> Encryption([FromBody] APP007_InputVo inputVo)
  • 這個端點使用 POST 請求來執行維護視窗的加密作業,並且要求授權 [Authorize]

  • 調用 _service.EncryptionResult(inputVo) 獲取結果。

  • 根據返回的狀態設置 ApiResultRESULT_CODERESULT_MESSAGE

  • TXT 檔案生成

    • 如果資料查詢成功,則會根據查詢結果產生 TXT 檔案。透過 FileExportHelper.CreateFileFromList() 方法來將支付資料轉換為 CSV 格式的檔案。如果檔案生成失敗,則記錄錯誤訊息並將 status 設置為 false
  • 加密

    • 在檔案生成成功後,會根據 P_FILE_TYPE 決定使用哪個加密方法(例如 DoEncryptionDoEncryptionCUB)。如果加密失敗,則會記錄錯誤訊息並停止處理。

總結

這個 APP007Controller 類別管理與 APP007 相關的各種 API 端點。每個端點都處理不同的業務邏輯操作,例如查詢檔案格式、檢查批號、執行作業、查詢和維護數據、加密作業等。控制器中的每個方法都通過調用相應的服務層方法來處理業務邏輯,並根據操作結果返回相應的 ApiResult