diff --git a/sa/bpm-架構圖.png b/sa/bpm-架構圖.png new file mode 100644 index 0000000..0a9b270 Binary files /dev/null and b/sa/bpm-架構圖.png differ diff --git a/sa/bpm-流程圖.png b/sa/bpm-流程圖.png new file mode 100644 index 0000000..7c3e6d3 Binary files /dev/null and b/sa/bpm-流程圖.png differ diff --git a/sa/readme.txt b/sa/readme.txt new file mode 100644 index 0000000..d5efbea --- /dev/null +++ b/sa/readme.txt @@ -0,0 +1,2 @@ + +https://github.com/bosscheng/vue-draggable-workflow diff --git a/sa/sa-amis-flow.txt b/sa/sa-amis-flow.txt new file mode 100644 index 0000000..d995d90 --- /dev/null +++ b/sa/sa-amis-flow.txt @@ -0,0 +1,457 @@ + +/* + (ok)bpmm01 簽核設定 + (ok)bpmm02 表單簽核流程 + -- 如果某一關有多人待簽, 如何實作一個 主管派工 的關卡? + bpmm11 簽核同意 + bpmm12 簽核駁回 + bpmm13 簽核作廢 + -- 作廢的 SOP + 1.(ok)必須先駁回到原申請人(駁回可以指定前面曾經簽過的人) + 2.(ok)申請人才能作廢 + + -- 考慮用 Tab 三合一, bpm 的登入預設頁面 + (ok)bpmq01 待簽核表單 + (ok)bpmq02 已簽核表單 - aside 選單別(只能加在 page, 所以改為 picker 查詢) + (ok)bpmq03 已結案表單 + + (ok)bpmq11 簽核歷程 + (ok)bpmq12 後續簽核人 + + todo: + 1.(ok)assign_to 要注意駁回及作廢時要如何 update (檢查並測試相關的 sp) + 2.(ok)已簽核表單要加 aside 查詢機制 + 3. + + (ok)整理一下 users 的相關資料,劃出組織架構(方便說明) -> 編號要易記 + (ok)並設定群組內含多人, 流程關卡可以在複雜一點 + (xx)是否要加入會簽可以考慮一下 + + (ok)Azure 紀錄的一定是格林威治時間, 和台北時間差 8 hours + 考慮寫一支 udf(cloud_addtime), 只要是含時間的欄位, 就 +8 hrs 再傳出(TBD) --> 僅顯示時用 + 測試 ok, 目前先用此法解決, 所有 sql 語法, 只要是要顯示時間, 該欄位就要呼叫本 udf + 列出所有需要顯示出時間的 sp 並測試 + ======================== ================ + bpm_sign_todo OK + bpm_sign_pass OK + bpm_sign_history OK + bpm_sign_finish OK + bpm_sign_signers OK + + eip_getCalendar OK + get_Schedule 應已不使用 + get_gantt_data OK + + orm_api 底層的 select 是否要加入(傾向 no) +*/ + +0.key-value 定義 +-- [sign_status] [varchar](2) not null, -- N:待簽核 P:簽核中 R:拒絶 A:同意 C:作廢 +insert into zen_keyvalue (tablename,fieldname,keyid,keyvalue) values ('xxxx','sign_status','N','待簽核'); +insert into zen_keyvalue (tablename,fieldname,keyid,keyvalue) values ('xxxx','sign_status','P','簽核中'); +insert into zen_keyvalue (tablename,fieldname,keyid,keyvalue) values ('xxxx','sign_status','R','拒絕'); +insert into zen_keyvalue (tablename,fieldname,keyid,keyvalue) values ('xxxx','sign_status','A','同意'); +insert into zen_keyvalue (tablename,fieldname,keyid,keyvalue) values ('xxxx','sign_status','C','作廢'); + +-- [flow_status] [varchar](2) not null, -- N:待簽核 P:簽核中 Z:結案 C:作廢 +insert into zen_keyvalue (tablename,fieldname,keyid,keyvalue) values ('xxxx','flow_status','N','待簽核'); +insert into zen_keyvalue (tablename,fieldname,keyid,keyvalue) values ('xxxx','flow_status','P','簽核中'); +insert into zen_keyvalue (tablename,fieldname,keyid,keyvalue) values ('xxxx','flow_status','Z','結案'); +insert into zen_keyvalue (tablename,fieldname,keyid,keyvalue) values ('xxxx','flow_status','C','作廢'); + + +1.先將 flow 的 json 寫到 db, 注意有單引號 + +2.再將 json 解析後, 寫到 flow setup 的相關 tables + +/* +訊光系統資料表 SYS_TODOHIS(SYS_TODOLIST)的STATUS欄位新增寫入狀態的功能, 如下: +結案時: 寫入 'Z', +前進(上呈)時: 寫入 'N', +退回時: 寫入 'NR', +取回時: 寫入 'NF' +作廢時: 寫入 'X', +加簽時: 寫入 'A'。 +任意加簽:'AA' +檢核(Validate)寫入: 'V' +'F':通知 +暫停時:寫入'NP' +============================ +flowflag +N:新起, +P:進行中 +Z:結案 +X:作廢 +N:取回 ?? +*/ + +-- flow 列表 +/* +alter table bpm_list add source_table varchar(100); +alter table bpm_list add source_pk varchar(100); +*/ +create table bpm_list ( + flow_id varchar(100) not null, + flow_name nvarchar(100), + functiontag varchar(100), -- 對應的功能, 如請假單 (hrsm11 ?) + -- New fields + source_table varchar(100), -- 來源單主 Tables + source_pk varchar(100), -- 來源單 pk, 如果是複合主鍵, 用逗號區隔 + source_note varchar(100), -- 來源單的主旨欄位名稱 + source_applicant varchar(20), -- 來源單的上呈人欄位名稱(預設 personid) + -- + flow_json nvarchar(max), + flow_json_org nvarchar(max) + primary key (flow_id) +) + +-- flow 內容設定 +/* +insert into zen_keyvalue (tablename,fieldname,keyid,keyvalue) values ('xxxx','elementId','startNode','startNode'); +insert into zen_keyvalue (tablename,fieldname,keyid,keyvalue) values ('xxxx','elementId','nodeNode','nodeNode'); +insert into zen_keyvalue (tablename,fieldname,keyid,keyvalue) values ('xxxx','elementId','conditionNode','conditionNode'); +insert into zen_keyvalue (tablename,fieldname,keyid,keyvalue) values ('xxxx','elementId','switchNode','switchNode'); +insert into zen_keyvalue (tablename,fieldname,keyid,keyvalue) values ('xxxx','elementId','stopNode','stopNode'); + +alter table bpm_setup add typeName varchar(10); + +FlowStatus as 簽核中,拒絶/同意 +*/ +create table bpm_setup ( + flow_id varchar(100) not null, + elementId varchar(20) not null, -- startNode,nodeNode,conditionNode,switchNode,stopNode + stepId varchar(100), -- 識別代號 + filterSet varchar(1000), -- 條件(condition only) + nextStep varchar(1000), + nextStep_false varchar(100), + stepName nvarchar(100), + -- new + typeName varchar(10), -- 類型 fields / users / roles ==> SignerType as 部門主管,指定欄位,指定角色,指定用戶,用戶主管 + roleName varchar(100) + primary key (flow_id,stepId) +) + +-- sign 步驟(spread from bpm_setup) 上呈時寫入(bpmm02_spread) +create table [dbo].[bpm_flow_sign]( + [id] int identity(1,1) not null, + [flow_id] [varchar](100) not null, + [sourceid] [varchar](100) not null, -- 原單的 pk(請假單-單號) + [stepName] [nvarchar](30) not null, + [flow_level] [smallint] not null, -- 次序 + --[totallevel] [smallint] not null, -- 沒有用(count 即可) + [signerid] [varchar](10) not null, + --[signername] [nvarchar](20) not null, + [sign_note] [nvarchar](600) null, -- 主旨(請假原因) + [sign_status] [varchar](2) not null, -- N:待簽核 P:簽核中 R:拒絶 A:同意 C:作廢 + --[signtime] [datetime] null, -- 建檔日期 + create_date datetime null, -- 上呈日期 + -- 考慮加入 3 個欄位(已加入), 在 同意/駁回 UX 上新增下一關的人員的選項, 如果下一關是多人, 就可以在此指派 + assign_to char(1), -- 如果某一關指定的 group 有多人, 用此欄位紀錄指派給誰(多人 default=N, 單人=Y) + estimate_date datetime null, -- 預計處理日(暫未使用) + real_date datetime null, -- 實際處理日(暫未使用) + -- the end + primary key (id) +) + +-- 暫存 spread 時 condition 的 nextStep (內容應僅保留最近 7 天資料即可) +create table [dbo].[bpm_flow_spread_log]( + [id] int identity(1,1) not null, + [flow_id] [varchar](100) not null, + [sourceid] [varchar](100) not null, + stepId varchar(100), + nextStep varchar(1000), + create_date datetime null, -- 寫入日期 + primary key (id) +) + +-- sign 紀錄 log +create table bpm_flow_sign_log ( + id int identity(1,1) not null, + flow_id varchar(100) not null, -- 關連到原單(請假單) + sourceid varchar(100) not null, -- 同上 + create_date datetime null, -- 寫入日期 + signerid varchar(10) not null, + sign_status [varchar](1) not null, -- R:拒絶 A:同意 + sign_note nvarchar(600) null, -- 簽核意見(同意或拒絕意見) + create_date datetime null, -- 寫入日期 + primary key (id) +) + +/* +-- 發送 mail 機制(master 的 zen_mail_list) +use master; +create table zen_mail_list ( + id int identity(1,1) not null, + corp_db varchar(20) null, -- 公司代號(統編) + recipient varchar(100) null, -- mail 收件人 + mail_subject datetime null, -- 主旨 + content varchar(10) null, -- 內容 + mail_status smallint null, -- 0:未發送 1:已發送 + create_date datetime null, -- 寫入日期 + primary key (id) +) +*/ + + +3.請假單相關 Tables +/* + hrs_leave 請假單 + hrs_leave_date 請假日期(by date) + hrs_leavetype 假別 +*/ +create table [dbo].[hrs_leave]( + [billdate] [datetime] not null, -- 申請日 + [billno] [varchar](20) not null, + [personid] [varchar](10) not null, -- 關聯 basperson + [agentid] [varchar](10) not null, -- 同上 + [leavetype] [char](10) not null, -- 關聯 hrs_leavetype + [starttime] [datetime] not null, + [endtime] [datetime] not null, + [days] [decimal](5, 1), + [hours] [decimal](5, 1), + [filename] [nvarchar](100), + [leave_status] [char](1), -- y/n 有效/無效 ?? + [leave_note] [nvarchar](200) null, -- 請假原因 + [create_user] [nvarchar](20) null, + [create_date] [datetime] null, + [update_user] [nvarchar](20) null, + [update_date] [datetime] null, + -- 暫時觀察 + --[flow_step] [int] not null, -- bpm_flow_sign.id (目前卡在哪一關) => 最終決定取消 + [flow_status] [varchar](2) not null, -- N:待簽核 P:簽核中 Z:結案 C:作廢 + flow_signer varchar(200), -- 目前簽到誰? 系統控制, 並在簽核過程中使用 + primary key(billno) +) + +-- 將區間的請假, 展開到以天為單位 +create table [dbo].[hrs_leave_date]( + [billno] [varchar](12) not null, + [billdate] [datetime] not null, + [stime] [varchar](10) not null, + [etime] [varchar](10) null, + [leaveday] [decimal](5, 1) null, + [leavehour] [decimal](5, 1) null, + primary key(billno,billdate) +) + +create table [dbo].[hrs_leavetype]( + [leavetype_id] [varchar](10) not null, + [leavetype_name] [nvarchar](10) null, + [leavetype_desc] [varchar](20) null, + [isyearage] [varchar](1) null, + [ispayed] [varchar](1) null, + [descrate] [decimal](12, 2) null, + [isdescfullentry] [varchar](1) null, + [type] [smallint] null, + [maxtimes_month] [int] null, + [maxtimes_year] [int] null, + [showoffwork] [varchar](1) null, + [sex] [varchar](2) null, + [permitsex] [varchar](2) null, + [isdelay] [char](1) null, + primary key(leavetype_id) +) + +-- +insert into zen_keyvalue (tablename,fieldname,keyid,keyvalue) values ('xxxx','sa_category','ON','上班'); +insert into zen_keyvalue (tablename,fieldname,keyid,keyvalue) values ('xxxx','sa_category','OFF','下班'); + +-- 打卡調整單(hrsm12) +create table [dbo].[hrs_swipecard_adjustment]( + [billdate] [datetime] not null, -- 出勤日期 + [billno] [varchar](20) not null, + [personid] [varchar](10) not null, -- 申請人(關聯 basperson) + -- + sa_title [nvarchar](200) null, -- 主旨 + sa_category [varchar](10) null, -- 打卡調整類型(on:上班/off:下班) + sa_description [nvarchar](max) null, -- 打卡調整原因 + -- + [create_user] [nvarchar](20) null, + [create_date] [datetime] null, + [update_user] [nvarchar](20) null, + [update_date] [datetime] null, + -- flow system fields + [flow_status] [varchar](2) not null, -- N:待簽核 P:簽核中 Z:結案 C:作廢 + flow_signer varchar(200), -- 目前簽到誰? 系統控制, 並在簽核過程中使用 + primary key(billno) +) +GO + + +/* + 資訊處理單及 + 系統變更需求確認書 +*/ +-- ok +insert into zen_keyvalue (tablename,fieldname,keyid,keyvalue) values ('xxxx','sr_category','net','網路問題'); +insert into zen_keyvalue (tablename,fieldname,keyid,keyvalue) values ('xxxx','sr_category','permission','權限問題'); +insert into zen_keyvalue (tablename,fieldname,keyid,keyvalue) values ('xxxx','sr_category','report','BI 報表問題'); +insert into zen_keyvalue (tablename,fieldname,keyid,keyvalue) values ('xxxx','sr_category','bpm','簽核表單'); +insert into zen_keyvalue (tablename,fieldname,keyid,keyvalue) values ('xxxx','sr_category','erp','企業管理軟體'); +insert into zen_keyvalue (tablename,fieldname,keyid,keyvalue) values ('xxxx','sr_category','others','其他'); + +-- 資訊問題處理單(eipm21) +-- 上呈 -> 直屬主管 -> IT主管 -> 派工 -> 驗收測試 -> 原提案人 -> 結案 +create table [dbo].[eip_service_request]( + [billdate] [datetime] not null, -- 申請日 + [billno] [varchar](20) not null, + [personid] [varchar](10) not null, -- 申請人(關聯 basperson) + -- + sr_title [nvarchar](200) null, -- 主旨 + sr_category [varchar](10) null, -- 問題類別(根據類別跑不同的 Group), 派工時根據相關設定判斷 Group, 派工設定流程要如何設定 + sr_description [nvarchar](max) null, -- 問題和用途描述 + [filename] [nvarchar](100), + -- + [create_user] [nvarchar](20) null, + [create_date] [datetime] null, + [update_user] [nvarchar](20) null, + [update_date] [datetime] null, + -- flow system fields + [flow_status] [varchar](2) not null, -- N:待簽核 P:簽核中 Z:結案 C:作廢 + flow_signer varchar(200), -- 目前簽到誰? 系統控制, 並在簽核過程中使用 + primary key(billno) +) +GO + +-- 系統變更需求確認書(eipm22) +create table [dbo].[eip_change_requirement]( + [billdate] [datetime] not null, -- 申請日 + [billno] [varchar](20) not null, + [personid] [varchar](10) not null, -- 申請人(關聯 basperson) + -- + cr_title [nvarchar](200) null, -- 主旨 + cr_module [varchar](10) null, -- 系統模組(hrs, eip, pms ...), 根據 module 跑不同的 Group --> 關聯 sys_module + cr_description [nvarchar](max) null, -- 需求說明 + [filename] [nvarchar](100), + -- + [create_user] [nvarchar](20) null, + [create_date] [datetime] null, + [update_user] [nvarchar](20) null, + [update_date] [datetime] null, + -- flow system fields + [flow_status] [varchar](2) not null, -- N:待簽核 P:簽核中 Z:結案 C:作廢 + flow_signer varchar(200), -- 目前簽到誰? 系統控制, 並在簽核過程中使用 + primary key(billno) +) +GO + +-- 辦公用品請領(eipm23) +create table [dbo].[eip_apply_receive]( + [billdate] [datetime] not null, -- 申請日 + [billno] [varchar](20) not null, + [personid] [varchar](10) not null, -- 申請人(關聯 basperson) + -- + ar_title [nvarchar](200) null, -- 主旨 + ar_category [varchar](10) null, -- 需求類別(根據類別跑不同的 Group), 派工時根據相關設定判斷 Group, 派工設定流程要如何設定 + ar_description [nvarchar](max) null, -- 需求說明 + -- + [create_user] [nvarchar](20) null, + [create_date] [datetime] null, + [update_user] [nvarchar](20) null, + [update_date] [datetime] null, + -- flow system fields + [flow_status] [varchar](2) not null, -- N:待簽核 P:簽核中 Z:結案 C:作廢 + flow_signer varchar(200), -- 目前簽到誰? 系統控制, 並在簽核過程中使用 + primary key(billno) +) +GO + +-- 產品測試紀錄表(crmm21) +/* +insert into zen_keyvalue (tablename,fieldname,keyid,keyvalue) values ('xxxx','package_method','Normal','正常包裝'); +insert into zen_keyvalue (tablename,fieldname,keyid,keyvalue) values ('xxxx','package_method','Others','其他'); +insert into zen_keyvalue (tablename,fieldname,keyid,keyvalue) values ('xxxx','final_process','Finished','成品銷售'); +insert into zen_keyvalue (tablename,fieldname,keyid,keyvalue) values ('xxxx','final_process','Sample','樣品'); +insert into zen_keyvalue (tablename,fieldname,keyid,keyvalue) values ('xxxx','final_process','Others','其他'); +*/ +create table [dbo].[crm_product_testing]( + [billdate] [datetime] not null, -- 申請日 + [billno] [varchar](20) not null, + [personid] [varchar](10) not null, -- 申請人(關聯 basperson) + -- + custid varchar(10) not null, -- 客戶編號(關聯 bascustomer) + productid varchar(20), -- 產品編號 + -- prodcname nvarchar(100), -- 產品名稱 + purpose nvarchar(600), -- 目的 + test_date datetime null, -- 試做日期 + need_qty decimal(10,2), -- 需求量 + package_method varchar(10), -- 包裝方式(正常包裝/其他) + Package_desc nvarchar(200), -- 包裝描述 + final_process varchar(10), -- 最終處理(成品銷售/樣品/其他) + final_desc nvarchar(200), -- 最終處理描述 + purpose_desc nvarchar(max), -- 製程需求/訴求 + spec_desc1 nvarchar(100), -- 巧克力 型態(軟質、硬質) + spec_desc2 nvarchar(100), -- 巧克力 融點(℃) + spec_desc3 nvarchar(100), -- 乳酪 融解性(高融點、可融) + spec_desc4 nvarchar(100), -- 乳酪 型態(片、丁、塊、絲等) + real_desc nvarchar(max), -- 試作情形說明 + response_desc nvarchar(max), -- 意見回覆 + followup_work nvarchar(max), -- 後續作業 + -- + [create_user] [nvarchar](20) null, + [create_date] [datetime] null, + [update_user] [nvarchar](20) null, + [update_date] [datetime] null, + close_date datetime null, -- 結案日期 + -- flow system fields + [flow_status] [varchar](2) not null, -- N:待簽核 P:簽核中 Z:結案 C:作廢 + flow_signer varchar(200), -- 目前簽到誰? 系統控制, 並在簽核過程中使用 + primary key(billno) +) +GO + + +4.加入上呈 sp 機制, 新增簽核紀錄檔 + exec bpmm02_spread @flod_id,@signerid,@billno; + +5.加入同意(核可) sp 機制 + exec bpmm02_sign_active @token,'A','hrsm11','221030-001','gm ok' + +6.加入駁回(reject) sp 機制 + exec bpmm02_sign_active @token,'R','hrsm11','221030-001','gm ok' + +7.加入作廢 sp 機制 + exec bpmm02_sign_active @token,'C','hrsm11','221030-001','gm ok' + + +A.待簽核表單 +A.1 (List) + 表單名稱 表單編號 主旨 申請人部門 申請人 進行步驟 填單時間 + ======== ============ ========== ========== ====== =========== =================== + 請假單 2022-08-0018 請假 資訊處 Michael 代理人 2022-08-22 14:20:54 + +select + b.flow_name,a.sourceid,a.sign_note,d.departmentcname,p.personcname,a.stepName,a.signtime +from bpm_flow_sign A +left join bpm_list B on A.flow_id = B.flow_id +left join basperson P on A.signerid = P.personid +left join basdepartment D on D.departmentid = P.departmentid +where a.signerid = @login_user and a.sign_status = 'P' -- 目前簽核關卡 + +A.2 (單筆顯示) + Form + [原單] + [簽核意見] + [簽核歷程] + + [同意] [駁回] [檢視後續簽核人] + +B.已簽核表單(List) + 表單編號 主旨 申請人部門 申請人 簽核步驟 表單送達時間 簽核結果 簽核時間 表單目前狀況 + ============ ======= ========== ====== =========== =================== ========== =================== ============ + 2022-08-0018 請假 資訊處 Michael 代理人 2022-08-22 14:20:54 同意 2022-08-22 14:20:54 同意結束 + +select + b.flow_name,a.sourceid,a.sign_note,d.departmentcname,p.personcname,a.stepName,a.signtime +from bpm_flow_sign A +left join bpm_list B on A.flow_id = B.flow_id +left join basperson P on A.signerid = P.personid +left join basdepartment D on D.departmentid = P.departmentid +-- where a.signerid = xxx and a.sign_status = 'New' -- 待確認 + + +C.已結案表單(List) + 表單編號 主旨 申請時間 簽核完成時間 歸檔資訊 + ============ ======= =================== ============================ ========== + 2022-08-0018 請假 2022-08-22 14:20:54 2022-08-22 14:20:54(駁回結束) 自動歸檔 + \ No newline at end of file diff --git a/sa/sa-bpm-flow.md b/sa/sa-bpm-flow.md new file mode 100644 index 0000000..6d816ea --- /dev/null +++ b/sa/sa-bpm-flow.md @@ -0,0 +1,272 @@ + +oO@~ŨtΪñ֬y{tγWѡCoM[cRQΤFpƮwBzʺA޿P]Transaction^uաAñNDPBȡ]pHol^εݪAȳBzC + +# SQL ws{Xʤñ֬y{tγW + +## 1. tά[cz + +ñ֬y{]BPM^HpƮw֤ߡAzLeݡ]p Vue + amis^wqy{ JSONAåѫݸƮwws{ǡ]Stored Procedures^tdѪRBi}PAX CưXiʡAPUB]pаBTBzBtܧݨD浥^L_jw CHqhĸѽ]pAѸƮwgJCA Node.js Ƶ{Aȵoe C + +--- + +## 2. ֤ߪAPNXwq + +tγzLзǤƥNX`IP檺ͩRgC + +### 2.1 `I (Element ID) + +* +**startNode**: y{_I C + + +* +**nodeNode**: @ñָ`I C + + +* +**conditionNode**: P_`I C + + +* +**switchNode**: `I C + + +* +**stopNode**: y{I C + + + +### 2.2 dñ֪A (`sign_status`) + +* +**N**: ñ C + + +* +**P**: ñ֤ C + + +* +**R**: ڵ]^^ C + + +* +**A**: PN C + + +* +**C**: @o C + + + +### 2.3 ӷ`骬A (`flow_status`) + +* +**N**: ñ C + + +* +**P**: ñ֤ C + + +* +**Z**: C + + +* +**C**: @o C + + + +--- + +## 3. Ʈwc (Schema Design) + +### 3.1 y{wqP]w + +* +**`bpm_list`**: sy{l JSON wqPӷp]w C + + +* ]tG`flow_id`B`flow_name`B`functiontag`]p hrsm11^ C + + +* p]wG`source_table`]ӷW^B`source_pk`]D^B`source_note`]D^ C + + +* wqɡG`flow_json`B`flow_json_org` C + + + + +* +**`bpm_setup`**: xs JSON ѪRi}`I C + + +* ]tG`elementId`B`stepId`B`filterSet`]󤽦^B`nextStep`B`nextStep_false` C + + +* ñ֤H]wG`typeName`]ñ֤HApDޡBw^B`roleName` C + + + + + +### 3.2 y{B@P + +* +**`bpm_flow_sign`**: ñdPBzA֤߸ƪ C + + +* ]tG`sourceid`B`stepName`B`flow_level`]dǡ^B`signerid`B`sign_status` C + + +* u@~G`assign_to`]YdhHA֪OAHΫwH YAl N^ C + + + + +* +**`bpm_flow_spread_log`**: Ȧsi}y{ condition `IP_ nextStep C + + +* ƶȫOd̪ 7 ѡAH`٪Ŷ C + + + + +* +**`bpm_flow_sign_log`**: ñְʧ@vy] C + + +* `sign_status`]PN/ڵ^P `sign_note`]ñַN^ C + + + + + +### 3.3 tξX + +* +**`zen_mail_list`**: wXloeC] `zenclouddb` `master`^ C + + +* ]tHBDBeP `mail_status`]0: oeA1: woe^ C + + + + + +--- + +## 4. ws{ (Stored Procedures) WM + +### 4.1 y{wq޲z (Setup & Parsing) + +* +**`bpmm01_crud`**: Neݳ]pny{ JSON gJΧs `bpm_list` ƪ C + + +* +**`bpmm01_get`**: zL `flow_id` X `bpm_list` Osl JSON eѫeݽs边V C + + +* +**`bpmm01_spread`**: N JSON 榡y{wqѪRpƼgJ `bpm_setup` C + + +* +**޿**: zLrΰjBzA `elementId` õѨ `filterSet`B]`nextStep`B`nextStep_false`^Ph]`switchNode` ̰䴩 10 branch^ CgJe|MªwqH C + + + + + +### 4.2 y{X (Engine Execution) + +* +**`bpmm02_spread`**: uWevIJoAtdNy{di}ڪñd C + + +* +**޿**: gJӽФH`I]flow_level = 0^Aä@UtJ `stopNode` C + + +* +**ʺA**: J `conditionNode` ɡA|ʺAո SQL hdߨӷ]p `hrs_leave`^Aھڱ󤽦]`filterSet`^絲GMw `nextStep` `nextStep_false` C + + +* +**lu**: NĤ@ñ֤H `assign_to` ] 'Y'Açsӷ檬A 'P' CPɱNqHgJC Node.js oe C + + + + +* +**`bpmm02_sign_active`**: Bz֤ߪñְʧ@]PN AB^ RB@o C^ C + + +* +**w**: {]Щ `BEGIN TRANSACTION` P `TRY...CATCH` ATOʪ@P C + + +* +**PN (A)**: iܤU@d]`flow_level + 1`^FY̫@AhN檬Aର ('Z') C + + +* +**^ (R)**: h^W@]`flow_level - 1`^Ψ̾ڶǤJ `@next_signer` wh^ܤegñֹLSwH C + + +* +**@o (C)**: y{AA] 'C' C + + +* +**A^g**: QΰʺA SQL]`sys_sql_debug`^^gӷ]pN `hrs_leave` `flow_status` s^ CgJy `bpm_flow_sign_log` C + + + + + +### 4.3 d߻PU (UI & Helpers) + +* +**`bpm_sign_todo`**: d߷enJϥΪ̪uñ֡vM]A 'P' B `assign_to` 'Y'^ C + + +* +**`bpm_sign_pass`**: dߨϥΪ̴gѻPñ֦u|סvuwñ֡vM C + + +* +**`bpm_sign_signers`**: CX@槹㪺uñ־{vPҦѻPLñ֤HA C + + +* +**`bpmm02_sign_assign`**: ѫe UI bPNλ^ɪuwñ֤HvUԿƨӷ C + + +* PNɡACXU@]`flow_level + 1`^HѥDެu C + + +* ^ɡACXvd]`flow_level < @flow_level`^ڳBzLHѫwh^ C + + + + + +--- + +## 5. ҮɰϳBz[c + +ѩƮwp󶳺ݡ]p Azure^AtΩhҬ UTC (Lªvɶ) CTOeݳPCܤ@PʡA@FM UDF ѨMG + +* +**`dbo.cloud_addtime`**: dߺݡ]p `bpm_sign_todo`, `bpm_sign_pass`, `bpm_sign_signers`^bX `create_date` ɶɡAIs禡ʺA[W 8 pഫx_ɶ C]pTOFhƪɰϯ²bסAȦbiܼhiഫC + + + +--- + +oMWw[\FzѪҦñ֤hӸ`Cݭnڬzi@B`JR䤤uʺA SQL mvAάOwu API Iso SP [cvi汴QܡH \ No newline at end of file