跳轉到

程式資訊

  • 程式 IDPermissionSetting
  • 所屬子系統:Other
  • 狀態:stable

批次權限設定

功能簡介

「批次權限設定」(程式類別 PermissionSetting)是一支批次編輯彈窗,用來把單一支程式(類別名稱/ProgramClass)的權限,一次套用到全部使用者。它不是從主選單獨立開啟的程式,而是從 使用者權限設定SECRET,A-010)的明細網格工具列、按 批次設定(明細擴充功能 ExtendedFunction1)後,以 ShowContentWindow 開出的子彈窗。

兩支程式的視角剛好相反:

  • 使用者權限設定以使用者為主軸——開一位使用者,逐支程式調權限。
  • 本頁是以程式為主軸——指定一支程式,把全部使用者對它的權限攤平成一張表,逐列勾改後一次存回。

適合系統管理員在「新上線一支程式、要替所有人開瀏覽權」或「某支程式要全面收回列印權」這類跨使用者一次調整的場景使用。

與「放行碼資料檢視」不要混淆

本頁的程式類別雖名為 PermissionSetting,但它做的是程式權限矩陣的批次設定。系統內另有一支 放行碼資料檢視ZPERMIT)是並行鎖定(PassNumber)的檢視表,與權限無關,兩者用途完全不同。

前置需求

  • 權限:本彈窗依附於 使用者權限設定SECRET,A-010),需具備該程式的瀏覽/修改權限才能開啟並存回。實務上只有系統管理員會持有。
  • 管理員身分:彈窗左上的「其他功能描述」清單只有具管理員身分Context.User.IsAdmin())的使用者才能編輯(DescriptionIsEnabled);一般使用者僅能檢視。
  • 基礎資料:要批次設定的資料完整度,取決於下列主檔——
資料 影響什麼
程式選單(功能表 _menum 輸入類別名稱後反查程式名稱GetProgramName),帶入畫面上的說明
使用者權限主檔(SECRET 查詢DARB_BD_SECRET)撈出的就是各使用者對該程式既有的權限列
程式內欄位定義 除外欄位/隱藏欄位/特修改欄位要填欄位的綁定名稱,控管才會對到欄位

操作步驟

本彈窗的進入點固定在 使用者權限設定 的明細網格:

  1. 開啟 使用者權限設定,在下方程式權限明細網格點選一列程式(即你要批次設定的那支程式)。
  2. 按明細工具列的 批次設定(擴充功能 ExtendedFunction1),系統開出本彈窗,並把剛才那列的序號/類別名稱/說明事項帶進來。

選擇編輯模式

  1. 在彈窗左上選 新增修改
    • 帶入的序號(LineNo_)不為空時,系統會自動切到 修改 模式。
    • 新增:用來替「目前 SECRET 序號」對應的那批使用者建立一支新程式的權限列。
    • 修改:對指定類別名稱已存在的權限列做批次調整。

輸入序號與類別名稱

  1. 確認或輸入 序號類別名稱(要批次設定的程式 ProgramClass)。
  2. 輸入或修改類別名稱時,系統會即時呼叫 GetProgramName 反查該程式的程式名稱並帶入說明(背後讀 _menum 功能表)。

先設定批次套用的控管值

  1. (視需要)在左上兩張小網格填好要整批套用的內容:左上「其他功能描述」清單與右上「欄位控管」四列(修改方式/除外欄位/隱藏欄位/特修改欄位)。這兩組值會在下一步按 查詢 撈完資料的當下自動寫回所有使用者列(見欄位連動與附加功能),所以要在按 查詢 之前填好。

查詢全部使用者

  1. 查詢:系統呼叫 DARB_BD_SECRET 取出全部使用者對該程式的權限列,攤平顯示在下方的批次網格(每一列是一位使用者)。

    • 新增 模式以「目前登入者在 SECRET 程式的序號」為查詢條件。
    • 修改 模式以「類別名稱=輸入的程式」為查詢條件。

    查詢與編輯態互斥

    查詢 鈕與下方網格的可編輯狀態是互相切換的(SetControl 事件同時翻轉 QueryEnabledDgIsReadOnly)。一旦查到資料、進入批次編輯態,查詢 鈕會被鎖住,避免你在編輯途中又重撈覆蓋掉手上的修改。要重查請先取消。

逐列勾改並存回

  1. 在批次網格逐列勾選/取消各使用者的權限方塊(可否瀏覽/明細/新增/修改/刪除/查歷史/列印/審核/流程/附件/其他 1~8/Excel/Pivot/Mail/看單價)。
  2. 存檔(透過彈窗底部的 SqlEditTurn 工具列存回)。存檔成功後關閉彈窗,主畫面 使用者權限設定 會自動重新整理(DataNavigateHelper.Renew)。

取消會釋放鎖定

若按取消(AfterCancel),系統會清掉這次批次撈出的資料(PrgsctBatch = null)並釋放放行碼鎖定,不會留下半套狀態。

欄位說明

上方:編輯模式與程式識別

欄位 必填 說明/格式/預設
新增/修改EditType 單選;帶入序號不為空時預設為 修改
序號LineNo_ 要批次設定的程式在 SECRET 中的序號;新增 模式存檔前不可空白
類別名稱EditProgramClass 程式的 ProgramClass;新增 模式存檔前不可空白;輸入後自動反查程式名稱

左上小網格:其他功能描述(Secret1

欄位 可編輯 說明
編號 1~36,對應該程式的 36 個 Other Function 槽位
其他功能描述 僅管理員 該擴充功能的描述文字(只有 IsAdmin 可改)
顯示說明 描述依使用者語言翻譯後的顯示文字(唯讀)

右上小網格:欄位控管(Secret2

欄位 可編輯 說明
序號 固定 01~04(唯讀)
項目 依語言翻譯顯示的項目名(修改方式/除外欄位/隱藏欄位/特修改欄位)
內容 要統一套用的值;按 查詢 撈完資料的當下寫回查出的每一列

下方批次網格:各使用者 × 權限(PrgsctBatch

每一列是一位使用者對該程式的權限。

欄位 可編輯 說明
使用者代號/使用者姓名 該列所屬使用者(唯讀)
序號/說明事項/顯示說明/類別名稱 程式識別(唯讀)
可否瀏覽/明細/新增/修改/刪除 基本 CRUD 與檢視權限(勾選方塊)
可否查歷史/列印/審核/流程/附件 查修改歷史、列印、審核、走流程、開附件
可否其他 1~8 各程式自訂的擴充功能開關(批次網格實際只顯示 1~8 欄);勾選方塊上的文字即「其他N說明」
Excel/Pivot/Mail/可否看單價 匯出 Excel、樞紐分析、寄信、檢視單價
其他權限/備註/其他說明 補充用文字欄
我的最愛 1~7 把此程式設為使用者主畫面捷徑
修改方式 欄位修改模式;Source 預設 ALL
除外欄位/隱藏欄位/特修改方式 欄位層級控管(綁定名稱清單/規則)

預設值來源

每一列的修改方式預設值是 ALL(由 Twork_sys_vw_prgsct1Source 建構式直接設定),代表「除『除外欄位』外的欄位都可改」。其餘權限旗標的初值來自 DARB_BD_SECRET 撈回的既有設定。

欄位連動與附加功能

這一節把「輸入某欄位或按某按鈕後,系統實際會做什麼」逐條列出,全部來自程式碼。

從 SECRET 帶入起始資料

彈窗由 SecretViewModel.ExtendedFunction1new PermissionSettingViewModel(Context, item) 建立,建構時若帶進一筆明細列(prgsct),會:

  • 把該列的序號填入 LineNo_類別名稱填入 EditProgramClass說明事項填入 Description
  • 呼叫 SetTempOtherFunction 建出該程式的 36 個 Other Function,顯示在左上「其他功能描述」清單;
  • 組出右上「欄位控管」四列(修改方式/除外欄位/隱藏欄位/特修改欄位),各列的項目名稱依使用者語言翻譯顯示;
  • 因為序號不為空,自動切到 修改 模式

輸入「類別名稱」→ 即時反查程式名稱

當你修改類別名稱EditProgramClass)時,setter 會立刻呼叫 SecretBll.GetProgramName,以 類別名稱 = 輸入值 到功能表 _menum 查出程式名稱並寫回 Description。換言之,打對的 ProgramClass 會即時帶出程式中文名;打錯則查不到、說明留空。

「其他功能描述」只有管理員能改

左上小網格(Secret1)的可編輯狀態綁 DescriptionIsEnabled,而該旗標只有在 Context.User.IsAdmin() 為真時才設為 true。因此一般使用者開彈窗時,「其他功能描述」欄是鎖住的,只能看不能改;管理員才可改各擴充功能的描述文字。

按「查詢」→ 撈出全部使用者並進入編輯態

查詢QueryCommand)會:

  1. 觸發 SqlEditTurnViewModel.TransferQuery(),內部走 BatchEditBll:先取放行碼鎖定,再執行 SqlQuery
  2. SqlQuery 呼叫預存程序 DARB_BD_SECRET 撈資料,查詢條件依模式不同:
    • 新增:以「目前登入者在 SECRET 程式的序號」為條件(B.序號 = 登入者序號)。
    • 修改:以「類別名稱=輸入的程式」為條件(B.類別名稱 = 程式)。
  3. 把撈回的列灌進批次網格(PrgsctBatch)。其中新增模式會預先把每列的序號/類別名稱/說明事項設成畫面上的值、標記為新增(增刪修=A、IsDirty),確保即使你沒再動任何方塊,存檔也撈得到這些列。

同時 SetControl 事件會翻轉 QueryEnabled(鎖住查詢鈕)與 DgIsReadOnly(解鎖批次網格),讓你開始勾改。

「欄位控管」四列會統一寫回所有列

查詢 的當下WhenSqlQueryTrueEditTypeIsEdit 流程,於撈完資料後立即執行),系統會把右上「欄位控管」小網格的四列內容,統一寫回批次網格的每一列

  • 第 01 列的內容 → 每列的修改方式
  • 第 02 列的內容 → 每列的除外欄位
  • 第 03 列的內容 → 每列的隱藏欄位
  • 第 04 列的內容 → 每列的特修改欄位(程式內部欄位為 特修改欄位

也就是說,這四個欄位層級控管設定是整批套用的——你在按 查詢 前先填好一次,全部使用者跟著套用同一組規則。其欄位語意(ALLNONE 模式、除外欄位、隱藏欄位)與 使用者權限設定 主畫面完全一致。

先填控管、再按查詢

這四列的寫回只在 查詢 撈資料當下發生一次(Edit 模式由 WhenSqlQueryTrue 寫、Add 模式由 SqlQuery 寫),不是存檔時才套用。請在按 查詢 之前就把右上「欄位控管」的內容填好。

「其他功能描述」會回寫到擴充欄位

左上「其他功能描述」清單的內容,同樣在查詢 撈完資料的當下透過 SetDescription 以反射逐筆回寫到每一列對應的其他N說明與顯示說明欄位(依編號對應 其他1說明其他36說明DisplayDescriptionOfExtendedFunction1…36)。因此管理員在此改一次描述,會套用到這次批次撈出的所有使用者列。

存檔(SqlEditTurn 工具列)做的事

存檔走 BatchEditBll.Save

  1. AllowSave 檢核——新增模式要求序號類別名稱都不可空白(否則提示「請先輸入 序號、類別名稱」);修改模式只要求序號不可空白(否則提示「請先輸入序號」)。
  2. 通過後把編輯落地到本機 SQLite(EF ChangeTracker 偵測真正有變動的列標記為 dirty)。
  3. 再把 dirty 且畫面上看得到的列轉成 XML 上傳主資料庫(UploadToSql),成功後狀態回到正常。

取消(AfterCancel

按取消會把批次資料清空(PrgsctBatch = null)並由 BatchEditBll.Cancel 釋放放行碼鎖定,避免半套狀態殘留或鎖定卡住其他人。

尚未提供的延伸動作

本彈窗目前不含查詢條件面板、列印、匯出 Excel、轉傳票或簽核等延伸動作;程式碼中沒有對應實作。批次套用的範圍就是「這次 查詢 撈出的那批使用者列」。

常見問題

在主選單找不到「批次權限設定」?

這支程式不是從主選單獨立開啟的。請先開 使用者權限設定(A-010),在下方程式權限明細點選一列程式,再按明細工具列的 批次設定 才會開出本彈窗。

輸入類別名稱後,旁邊的程式說明是空白?

說明來自功能表 _menum,以類別名稱反查程式名稱。若留空,多半是類別名稱(ProgramClass)打錯、或該程式未登錄在功能表。請確認輸入的是正確的 ProgramClass 字串。

存檔一直被擋,說要輸入序號/類別名稱?

這是 AllowSave 的檢核:新增模式要求序號類別名稱都要填;修改模式至少要填序號。請補齊後再存。

「其他功能描述」欄改不動?

該清單只有具管理員身分IsAdmin)的使用者可編輯;一般使用者僅能檢視。若你需要修改擴充功能描述,請以管理員帳號操作。

查完想重查,卻發現「查詢」鈕變灰?

查詢 與批次網格是互斥狀態——查到資料、進入編輯態後查詢鈕會被鎖住,避免覆蓋你手上的修改。請先取消(會釋放鎖定並清空資料),再重新輸入條件查詢。

設了「除外欄位」,使用者進該程式卻還是能改?

欄位控管的語意與 使用者權限設定 相同:ALL 模式下「除外欄位」=不可改、其餘可改;NONE 模式下「除外欄位」=唯一可改。另外欄位要填正確的綁定名稱(中文屬性名,逗號分隔),填錯不會報錯但控管不生效。本彈窗的四個控管欄是整批套用到所有列的。

相關功能


需補截圖清單

以下截圖待功能 runtime 驗收後補拍(放 docs/Other/images/):

  1. permissionsetting-step1.png — 彈窗全貌(上方新增/修改+序號/類別名稱,左右兩張小網格,下方批次網格)
  2. permissionsetting-step2.png — 自 SECRET 明細按 批次設定 開啟、帶入序號/類別名稱的樣子
  3. permissionsetting-step3.png — 按 查詢 後攤平全部使用者、批次網格進入可勾選態