SO表單
# SO表單
提示
以下內容涉及到模組開發,以下內容僅適用於流程設計開發人員閱讀。
FastBPM 與其他工作流程管理軟體相比,特色之處在於可以輕鬆整合表單的功能,使工作流程與表單建立起更明確的關係,將傳統ERP中難以管轄的工作流專用的零散表單納入列管,使企業的工作流程更符合標準體系規範的要求。
在標準化規範實施的過程中,通常需要對標準的工作流程內容進行記錄,產生紙質的檔案,這些內容會貫穿整個產品的生命週期。但是,這些內容往往停留在紙質表面,很難被軟件系統利用。因為這些紙質檔案很多都是非規格化的內容,且是針對企業生產實際進行設計的,傳統的軟件系統(ERP)由於沒有建立起這些資料數據的關聯性,故要將其轉化為電腦操作的表單需花費大量時間,操作也相對繁瑣。
FastBPM的出現解決了上述問題。FastBPM來源於FastERP,使用的是相同的開發框架,使用者只要熟悉了FastERP的模組開發方法,就能在FastBPM上進行SO表單的開發。以下將介紹在FastBPM上開發一個適用於特定流程的SO表單,並將其與工作流程繫結。
# 1. 構建數據表結構
製作SO表單的第一步,需要構建SO表單所需的欄位。其中部分欄位內容是根據SO表單的欄位來制定,請自行根據SO表單分析並新增這些欄位,以下僅介紹FastBPM中必須要包含的表字段的說明。
- 主表字段的說明(建議以SO表單編號為表名,特殊符號使用下劃線替代,例如這個SO表單的編號為
EFO-1702
,則表名稱可以命名為EFO_1702
)
欄位名稱 | 數據型別 | 說明 |
---|---|---|
FInterID | varchar(36) | 單據ID,主鍵,建議使用GUID產生 |
FDate | datetime | 單據日期,建議不要包含時間資訊 |
FBillID | varchar(20) | 單據ID,參考流水號設計 |
FBillNo | varchar(50) | 單據編號,參考流水號設計 |
FStatus | int | 單據狀態0 - 已作廢 1 - 草稿 2 - 已審覈 3 - 已覈準 4 - 已確認 |
FCreater | varchar(50) | 單據建立使用者 |
FCreateDate | datetime | 單據建立時間 |
FChecker | varchar(50) | 審覈使用者 |
FCheckDate | datetime | 審覈時間 |
FClosed | int | 關閉狀態, 0 - 未關閉1 - 已關閉 |
FApproval | varchar(50) | 覈準使用者 |
FApprovalDate | datetime | 覈準時間 |
FConfirm | varchar(50) | 確認使用者 |
FConfirmDate | datetime | 確認時間 |
- 明細表欄位的說明(如果有明細表,以下為必要的欄位。表名稱建議使用
SO表單編號_D
,以主表的SO表單編號為例,明細表的表名為EFO_1702_D
)
欄位名稱 | 數據型別 | 說明 |
---|---|---|
FID | varchar(36) | 單據明細ID,主鍵 |
FInterID | varchar(36) | 單據ID,外來鍵 |
FEntryID | int | 序號 |
FKey | int | 對應的工作流實體的ID |
FCreatedDate | datetime | 記錄建立日期 |
FUserName | varchar(50) | 記錄建立使用者 |
# 2. 構建預存程序
構建預存程序,是爲了建立FastBPM單據狀態變更的運行邏輯,從而實現單據管控的功能。
可參考以下實體構建專用的預存程序實體,只需要將其中的 EFO_1702
批次替換為實際的主表名稱:
CREATE PROCEDURE [dbo].[sp_EFO_1702]
@ProcID VARCHAR(10), --處理標識:Check、UnCheck、Revoke、Recover、Delete
@DataID VARCHAR(50), --數據ID
@UserID VARCHAR(50) --使用者ID
AS
DECLARE @SkipStatus INT; --狀態不對直接跳過,不提示錯誤
SELECT @SkipStatus = 0; --不處理這個參數
DECLARE @FReturnFlag INT,
@FReturnMsg VARCHAR(100);
DECLARE @Status INT,
@BillNo VARCHAR(30);
--初始化變數
SELECT @FReturnFlag = 1,
@FReturnMsg = '';
SELECT @Status = FStatus,
@BillNo = FBillNo
FROM EFO_1702
WHERE FInterID = @DataID;
IF @@ROWCOUNT = 0
BEGIN
SELECT @FReturnFlag = 0,
@FReturnMsg = '沒有找到單據,可能已被刪除!';
END;
BEGIN TRAN tr_EFO_1702;
IF @ProcID = 'Check'
BEGIN
--審覈
IF @Status = 0
BEGIN
IF @SkipStatus = 1
SELECT @FReturnFlag = 1,
@FReturnMsg = '';
ELSE
SELECT @FReturnFlag = 0,
@FReturnMsg = '單據已作廢,不能審覈!';
RETURN;
END;
ELSE IF @Status = 2
BEGIN
IF @SkipStatus = 1
SELECT @FReturnFlag = 1,
@FReturnMsg = '';
ELSE
SELECT @FReturnFlag = 0,
@FReturnMsg = '單據已經審覈,不需要再審覈!';
RETURN;
END;
ELSE IF @Status = 3
BEGIN
IF @SkipStatus = 1
SELECT @FReturnFlag = 1,
@FReturnMsg = '';
ELSE
SELECT @FReturnFlag = 0,
@FReturnMsg = '單據已覈準,不能審覈!';
RETURN;
END;
ELSE IF @Status = 4
BEGIN
IF @SkipStatus = 1
SELECT @FReturnFlag = 1,
@FReturnMsg = '';
ELSE
SELECT @FReturnFlag = 0,
@FReturnMsg = '單據已確認,不能審覈!';
RETURN;
END;
--更新狀態
IF @FReturnFlag = 1
UPDATE EFO_1702
SET FStatus = 2,
FChecker = @UserID,
FCheckDate = GETDATE()
WHERE FInterID = @DataID;
IF @@ERROR <> 0
BEGIN
SELECT @FReturnFlag = 0,
@FReturnMsg = '單據審覈時出錯!';
END;
END;
ELSE IF @ProcID = 'UnCheck'
BEGIN
--消審
IF @Status = 0
BEGIN
IF @SkipStatus = 1
SELECT @FReturnFlag = 1,
@FReturnMsg = '';
ELSE
SELECT @FReturnFlag = 0,
@FReturnMsg = '單據已作廢,不能消審!';
END;
ELSE IF @Status = 1
BEGIN
IF @SkipStatus = 1
SELECT @FReturnFlag = 1,
@FReturnMsg = '';
ELSE
SELECT @FReturnFlag = 0,
@FReturnMsg = '單據尚未審覈,不需要消審!';
END;
ELSE IF @Status = 3
BEGIN
IF @SkipStatus = 1
SELECT @FReturnFlag = 1,
@FReturnMsg = '';
ELSE
SELECT @FReturnFlag = 0,
@FReturnMsg = '單據已覈準,不能消審!';
RETURN;
END;
ELSE IF @Status = 4
BEGIN
IF @SkipStatus = 1
SELECT @FReturnFlag = 1,
@FReturnMsg = '';
ELSE
SELECT @FReturnFlag = 0,
@FReturnMsg = '單據已確認,不能消審!';
RETURN;
END;
--更新狀態
IF @FReturnFlag = 1
UPDATE EFO_1702
SET FStatus = 1,
FChecker = NULL,
FCheckDate = NULL
WHERE FInterID = @DataID;
IF @@ERROR <> 0
BEGIN
SELECT @FReturnFlag = 0,
@FReturnMsg = '單據消審時出錯!';
END;
END;
ELSE IF @ProcID = 'Approval'
BEGIN
--消審
IF @Status = 0
BEGIN
IF @SkipStatus = 1
SELECT @FReturnFlag = 1,
@FReturnMsg = '';
ELSE
SELECT @FReturnFlag = 0,
@FReturnMsg = '單據已作廢,不能覈準!';
END;
ELSE IF @Status = 1
BEGIN
IF @SkipStatus = 1
SELECT @FReturnFlag = 1,
@FReturnMsg = '';
ELSE
SELECT @FReturnFlag = 0,
@FReturnMsg = '單據尚未審覈,不能覈準!';
END;
ELSE IF @Status = 3
BEGIN
IF @SkipStatus = 1
SELECT @FReturnFlag = 1,
@FReturnMsg = '';
ELSE
SELECT @FReturnFlag = 0,
@FReturnMsg = '單據已覈準,不需要覈準!';
RETURN;
END;
ELSE IF @Status = 4
BEGIN
IF @SkipStatus = 1
SELECT @FReturnFlag = 1,
@FReturnMsg = '';
ELSE
SELECT @FReturnFlag = 0,
@FReturnMsg = '單據已確認,不能覈準!';
RETURN;
END;
--更新狀態
IF @FReturnFlag = 1
UPDATE EFO_1702
SET FStatus = 3,
FApproval = @UserID,
FApprovalDate = GETDATE()
WHERE FInterID = @DataID;
IF @@ERROR <> 0
BEGIN
SELECT @FReturnFlag = 0,
@FReturnMsg = '單據覈準時出錯!';
END;
END;
ELSE IF @ProcID = 'UnApproval'
BEGIN
--消審
IF @Status = 0
BEGIN
IF @SkipStatus = 1
SELECT @FReturnFlag = 1,
@FReturnMsg = '';
ELSE
SELECT @FReturnFlag = 0,
@FReturnMsg = '單據已作廢,不能取消覈準!';
END;
ELSE IF @Status = 1
BEGIN
IF @SkipStatus = 1
SELECT @FReturnFlag = 1,
@FReturnMsg = '';
ELSE
SELECT @FReturnFlag = 0,
@FReturnMsg = '單據尚未審覈,不能取消覈準!';
END;
ELSE IF @Status = 2
BEGIN
IF @SkipStatus = 1
SELECT @FReturnFlag = 1,
@FReturnMsg = '';
ELSE
SELECT @FReturnFlag = 0,
@FReturnMsg = '單據已審覈,不能取消覈準!';
RETURN;
END;
ELSE IF @Status = 4
BEGIN
IF @SkipStatus = 1
SELECT @FReturnFlag = 1,
@FReturnMsg = '';
ELSE
SELECT @FReturnFlag = 0,
@FReturnMsg = '單據已確認,不能取消覈準!';
RETURN;
END;
--更新狀態
IF @FReturnFlag = 1
UPDATE EFO_1702
SET FStatus = 2,
FApproval = NULL,
FApprovalDate = NULL
WHERE FInterID = @DataID;
IF @@ERROR <> 0
BEGIN
SELECT @FReturnFlag = 0,
@FReturnMsg = '單據取消覈準時出錯!';
END;
END;
ELSE IF @ProcID = 'Confirm'
BEGIN
--消審
IF @Status = 0
BEGIN
IF @SkipStatus = 1
SELECT @FReturnFlag = 1,
@FReturnMsg = '';
ELSE
SELECT @FReturnFlag = 0,
@FReturnMsg = '單據已作廢,不能確認!';
END;
ELSE IF @Status = 1
BEGIN
IF @SkipStatus = 1
SELECT @FReturnFlag = 1,
@FReturnMsg = '';
ELSE
SELECT @FReturnFlag = 0,
@FReturnMsg = '單據尚未審覈,不能確認!';
END;
ELSE IF @Status = 2
BEGIN
IF @SkipStatus = 1
SELECT @FReturnFlag = 1,
@FReturnMsg = '';
ELSE
SELECT @FReturnFlag = 0,
@FReturnMsg = '單據已審覈,不能確認!';
RETURN;
END;
ELSE IF @Status = 4
BEGIN
IF @SkipStatus = 1
SELECT @FReturnFlag = 1,
@FReturnMsg = '';
ELSE
SELECT @FReturnFlag = 0,
@FReturnMsg = '單據已確認,不需要確認!';
RETURN;
END;
--更新狀態
IF @FReturnFlag = 1
UPDATE EFO_1702
SET FStatus = 4,
FConfirm = @UserID,
FConfirmDate = GETDATE()
WHERE FInterID = @DataID;
IF @@ERROR <> 0
BEGIN
SELECT @FReturnFlag = 0,
@FReturnMsg = '單據確認時出錯!';
END;
END;
ELSE IF @ProcID = 'UnConfirm'
BEGIN
--消審
IF @Status = 0
BEGIN
IF @SkipStatus = 1
SELECT @FReturnFlag = 1,
@FReturnMsg = '';
ELSE
SELECT @FReturnFlag = 0,
@FReturnMsg = '單據已作廢,不能取消確認!';
END;
ELSE IF @Status = 1
BEGIN
IF @SkipStatus = 1
SELECT @FReturnFlag = 1,
@FReturnMsg = '';
ELSE
SELECT @FReturnFlag = 0,
@FReturnMsg = '單據尚未審覈,不能取消確認!';
END;
ELSE IF @Status = 2
BEGIN
IF @SkipStatus = 1
SELECT @FReturnFlag = 1,
@FReturnMsg = '';
ELSE
SELECT @FReturnFlag = 0,
@FReturnMsg = '單據已審覈,不能取消確認!';
RETURN;
END;
ELSE IF @Status = 3
BEGIN
IF @SkipStatus = 1
SELECT @FReturnFlag = 1,
@FReturnMsg = '';
ELSE
SELECT @FReturnFlag = 0,
@FReturnMsg = '單據已覈準,不能取消確認!';
RETURN;
END;
--更新狀態
IF @FReturnFlag = 1
UPDATE EFO_1702
SET FStatus = 3,
FConfirm = NULL,
FConfirmDate = NULL
WHERE FInterID = @DataID;
IF @@ERROR <> 0
BEGIN
SELECT @FReturnFlag = 0,
@FReturnMsg = '單據取消確認時出錯!';
END;
END;
ELSE IF @ProcID = 'Revoke'
BEGIN
--作廢
IF @Status = 2
BEGIN
IF @SkipStatus = 1
SELECT @FReturnFlag = 1,
@FReturnMsg = '';
ELSE
SELECT @FReturnFlag = 0,
@FReturnMsg = '單據已審覈,不能作廢!';
RETURN;
END;
ELSE IF @Status = 0
BEGIN
IF @SkipStatus = 1
SELECT @FReturnFlag = 1,
@FReturnMsg = '';
ELSE
SELECT @FReturnFlag = 0,
@FReturnMsg = '單據已經作廢,不需要再進行作廢處理!';
RETURN;
END;
ELSE IF @Status = 3
BEGIN
IF @SkipStatus = 1
SELECT @FReturnFlag = 1,
@FReturnMsg = '';
ELSE
SELECT @FReturnFlag = 0,
@FReturnMsg = '單據已覈準,不能作廢!';
RETURN;
END;
ELSE IF @Status = 4
BEGIN
IF @SkipStatus = 1
SELECT @FReturnFlag = 1,
@FReturnMsg = '';
ELSE
SELECT @FReturnFlag = 0,
@FReturnMsg = '單據已確認,不能作廢!';
RETURN;
END;
--更新狀態
IF @FReturnFlag = 1
UPDATE EFO_1702
SET FStatus = 0,
FCheckDate = NULL
WHERE FInterID = @DataID;
IF @@ERROR <> 0
BEGIN
SELECT @FReturnFlag = 0,
@FReturnMsg = '單據作廢時出錯!';
IF @@TranCount > 0
ROLLBACK TRAN;
END;
END;
ELSE IF @ProcID = 'Recover'
BEGIN
--還原
IF @Status <> 0
BEGIN
IF @SkipStatus = 1
SELECT @FReturnFlag = 1,
@FReturnMsg = '';
ELSE
SELECT @FReturnFlag = 0,
@FReturnMsg = '單據沒有作廢,不能還原!';
END;
--更新狀態
IF @FReturnFlag = 1
UPDATE EFO_1702
SET FStatus = 1,
FCheckDate = NULL
WHERE FInterID = @DataID;
IF @@ERROR <> 0
BEGIN
SELECT @FReturnFlag = 0,
@FReturnMsg = '單據還原時出錯!';
END;
END;
ELSE IF @ProcID = 'Delete'
BEGIN
--刪除
IF @Status <> 0
BEGIN
IF @SkipStatus = 1
SELECT @FReturnFlag = 1,
@FReturnMsg = '';
ELSE
SELECT @FReturnFlag = 0,
@FReturnMsg = '單據沒有作廢,不能刪除。要刪除申請單,請先將單據作廢!';
RETURN;
END;
DECLARE @errCount INT;
SELECT @errCount = 0;
--更新狀態
DELETE EFO_1702
WHERE FInterID = @DataID;
SELECT @errCount = @errCount + @@ERROR;
IF @errCount <> 0
BEGIN
SELECT @FReturnFlag = 0,
@FReturnMsg = '單據刪除時出錯!';
END;
END;
Error:
IF @FReturnFlag = 1
COMMIT TRANSACTION tr_EFO_1702;
ELSE
BEGIN
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION tr_EFO_1702;
END;
IF @FReturnFlag = 0
RAISERROR(@FReturnMsg, 16, 1);
GO
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
# 3. 為SO表單設計編號規則
為SO表單設計的編號規則,可用於在新增SO表單時產生單據編號,用於工作流程間的單據流轉記錄。
打開[平臺設計]-[流水號設計]
,其中顯示的內容為單據的字首,日期產生的格式與序號位數。新增對應的記錄,編輯編號規則后儲存。

# 4. 設計SO表單模組
打開
[平臺設計]-[模組設計]
,進入模組設計畫面,點選新建節點,將兩個模組分別命名為EFO_1702_L(查詢列表)
與EFO_1702(編輯框)
,分別進行設計,關於模組設計的方式請參考FastERP開發流程-列表 與 FastERP開發流程-編輯窗體。提示
請注意,編輯框對應的模組的編號要與主表名稱一致。否則後續在流程圖使用SO表單時無法定位至目標模組。
建立功能表,與模組繫結。
# 5. 工作流程中引用SO表單
當建立完成SO表單后,如需要在工作流程中引用編輯,請按照以下方式來進行操作:
在工作流程設計階段引入SO表單。點選
[BPM流程管理]-[流程設計]
,打開流程設計畫面。選擇要設定新增SO表單的流程,點選[流程表單]
標籤頁。點選[匯入表單]
,打開表單選擇框,選擇要匯入的表單。選擇表單的填寫頻率、與哪個任務稽覈點關聯后,點選[儲存]
按鈕。在流程任務運行時編輯SO表單。當工作流程在運行時,使用者可以在附件管理中引入檔案列表的文件內容。點選
[BPM流程管理]-[待辦事項]
,打開待辦事項列表,從中選擇打開任務進度對話方塊。切換至[流程表單]
選項卡。點選[編輯表單]
按鈕,將根據表單編號資訊打開對應的模組編輯視窗,可以在此處進行單據編輯操作,編輯完成後點選[儲存]
,退出時,流程中的單據編號資訊會更新。