Commit 07f72f6c19b7a7c9a383a37ff8a9fb21d9347a22
1 parent
96573a81
docs: en wiki — Activiti is bypassed by xly's simple approval path
Critical correction in response to "no BPMN deployed means not used?": yes, in this dev DB, Activiti's runtime is never invoked. Findings: - xly has TWO parallel approval mechanisms, only one of which uses Activiti. - Path 1 (simple toggle): the "审核" button in the SPA POSTs to /business/doExamine → BusinessBaseController.java:384-391 → BusinessBaseServiceImpl.doExamine() → ExamineServiceImpl. Verified (grep -E 'runtimeService|taskService|processService|complete' against ExamineServiceImpl.java returns 0 hits) — this service flips bCheck=1 via direct SQL, never touching Activiti. This is the path actually used today. - Path 2 (BPMN workflow): would only trigger when a gdsmodule has bCheck=1 AND a populated gdsmoduleflow row pointing at a deployed procdef. None of these exist in the dev DB. - The bCheck flag is therefore xly's own approval boolean, owned by BusinessBaseServiceImpl, used widely as a list filter (SalesOrderServiceImpl etc. do WHERE bCheck=1 on every "show approved-only" query). - /business/doExamine + /business/getProData added to internal.md endpoint table. - activiti.md gets a "Two approval paths" section as the lead so a reader doesn't conflate the simple bCheck toggle with the workflow engine. - The TL;DR is rewritten to make the "engine wired but not invoked" story explicit.
Showing
2 changed files
with
32 additions
and
6 deletions
en/docs/api-reference/internal.md
| ... | ... | @@ -26,6 +26,8 @@ page is the catalog of HTTP entry points. |
| 26 | 26 | | `/business/getSelectDataBysControlId/{sId}` | POST | Dropdown population for a single control, by control `sId`. | |
| 27 | 27 | | `/business/getSelectLimit/{sId}` | POST | Paginated variant of the dropdown call. | |
| 28 | 28 | | `/business/addSysLocking` | POST | Optimistic-lock acquisition when a user starts editing a document — inserts a row in the system lock table keyed by `(sFormGuid, sUserId)`. The SPA fires this when entering edit mode so concurrent editors get a conflict warning. Handler: `BusinessBaseController.java:400-407`. | |
| 29 | +| `/business/doExamine` | POST | Simple "approve" — flips `bCheck = 1` on the named row via SQL. **Does NOT invoke Activiti**; this is xly's lightweight approval path used by every module that doesn't need multi-step workflow. Handler: `BusinessBaseController.java:384-391` → `BusinessBaseServiceImpl.doExamine` → `ExamineServiceImpl`. See [Two approval paths](../reference/maintainer/activiti.md#two-approval-paths) for when Activiti is used instead. | | |
| 30 | +| `/business/getProData` | POST | Generic stored-procedure invocation for a module — alternate path to `/procedureCall/doGenericProcedureCall`. Handler: `BusinessBaseController.java:350-358` → `BusinessBaseServiceImpl.getProData`. Used by FROUNT for module-level proc reads (the home dashboard `/getProData?sModelsId=...&sName=` pattern). | | |
| 29 | 31 | |
| 30 | 32 | These endpoints are documented in detail by [Slice 1](../slices/01-hello-world.md) |
| 31 | 33 | (`getModelBysId` + grid load + save) and | ... | ... |
en/docs/reference/maintainer/activiti.md
| 1 | 1 | # Activiti integration |
| 2 | 2 | |
| 3 | -> **State on this dev DB: engine wired, never used.** The Activiti | |
| 4 | -> engine is fully bootstrapped at runtime, the `act_*` schema is | |
| 5 | -> provisioned, the BPMN modeler UI is reachable — but **every | |
| 6 | -> workflow-related table is empty**. No BPMN deployed, no process | |
| 7 | -> instances ever started, no `gdsmodule` row currently has | |
| 8 | -> `bCheck = 1`. The plumbing is hot; nothing is flowing. | |
| 3 | +> **TL;DR — Activiti is wired, the engine runs, no traffic flows | |
| 4 | +> through it.** Engine bootstrapped, `act_*` schema provisioned at | |
| 5 | +> 6.0.0.4, BPMN modeler reachable. But every workflow table is 0 | |
| 6 | +> rows: no BPMN, no procdefs, no instances, no tasks. No | |
| 7 | +> `gdsmodule.bCheck=1`. No `gdsmoduleflow` link. **The approval | |
| 8 | +> button users see (`/business/doExamine`) bypasses Activiti | |
| 9 | +> entirely** and just UPDATEs `bCheck=1` via SQL — see | |
| 10 | +> [Two approval paths](#two-approval-paths) below. | |
| 9 | 11 | |
| 10 | 12 | This page documents what's actually wired (concrete classes, URLs, |
| 11 | 13 | engine state) and what would have to be true for it to do anything. |
| 12 | 14 | |
| 15 | +## Two approval paths | |
| 16 | + | |
| 17 | +xly ships two parallel approval mechanisms. They look similar from | |
| 18 | +the UI but go through completely different code: | |
| 19 | + | |
| 20 | +| Path | Triggered by | Backend | Activiti involvement | | |
| 21 | +|---|---|---|---| | |
| 22 | +| **Simple "approve" toggle** | The "审核" button on a single-row form | `POST /business/doExamine` → `BusinessBaseController.java:384-391` → `BusinessBaseServiceImpl.doExamine()` → `ExamineServiceImpl` (xlyBusinessService). The service runs an UPDATE that flips `bCheck = 1` (and writes audit fields). | **None.** `grep` confirms `ExamineServiceImpl` calls neither `runtimeService`, `taskService`, `processService`, nor any other Activiti API. The `bCheck` flag is xly's own boolean, owned by `BusinessBaseServiceImpl`. Used widely as a list filter (`SalesOrderServiceImpl` and friends do `WHERE bCheck = 1` on every "show approved-only" query). | | |
| 23 | +| **Multi-step BPMN workflow** | A user submits a row whose module has `bCheck = 1` AND a populated `gdsmoduleflow` row pointing at a deployed `act_re_procdef` | `ProcessServiceImpl.submitApply()` → `runtimeService.startProcessInstanceByKey(...)`. Subsequent approvers act through `CurrencyFlowController.complete(...)` → `taskService.complete()`. xly mirrors state in `biz_flow` + `biz_todo_item`. | **Full Activiti.** Requires a deployed BPMN (in `act_re_procdef`), an active process instance (in `act_ru_*`), and an assigned task (`act_ru_task`). | | |
| 24 | + | |
| 25 | +In this dev DB, **path 1 is the only path that runs**. Path 2 has zero | |
| 26 | +configuration anywhere — no BPMN deployed, no `gdsmoduleflow` row, no | |
| 27 | +`gdsmodule.bCheck=1` modules. So when a user clicks 审核 today, the | |
| 28 | +record gets approved via the simple-toggle path and Activiti is not | |
| 29 | +involved. | |
| 30 | + | |
| 31 | +Why the second path even exists: a customer that *does* need a real | |
| 32 | +multi-step approval (warehouse → finance → GM, with reassignment and | |
| 33 | +delegation) gets it by deploying a BPMN through the modeler and | |
| 34 | +linking modules via `gdsmoduleflow`. That activates path 2 for those | |
| 35 | +modules; path 1 still handles everything else. | |
| 36 | + | |
| 13 | 37 | ## Activiti is wired — engine ON |
| 14 | 38 | |
| 15 | 39 | Despite the dev DB being idle, the engine boots with `xlyEntry`: | ... | ... |