-
en: every file:line citation, table-row count, endpoint, and diagram entity re-verified against xly-src and the live DB. Numerous small precision fixes across all wiki pages. api-reference/internal.md adds a new section enumerating the 52 non-framework controllers so readers can see what xly hardcoded vs. left to metadata. zh: parallel translation sync (38 modified + 3 new maintainer pages).
-
Five mermaid diagrams across the en wiki, plus fix one stale arrow in the existing concepts/index diagram. New: - reference/maintainer/deployment.md — full topology at a glance: 6 deployable Spring Boot apps with their default-profile ports + context paths + Boot main classes, the 8 library modules and what they're consumed by, the operator-facing SPAs (BACK :8597 / FROUNT :8598) traced through nginx into xlyEntry/xlyApi, and the shared infra cluster (MySQL / Redis :16379 / ActiveMQ :61616 / MongoDB wired-but-unused). Surfaces the "xlyFlow + xlyPlc share /xlyEntry context-path" subtlety and the "xlyErpJmsConsumer has no port, inherits" oddity in one picture. - reference/maintainer/cache-invalidation.md — dual-path diagram showing the synchronous @CacheEvict path (green) next to the JMS PRO_ERPMERGEBASEGDSMODULE base-data merge (red, labelled "NOT cache"). Anchors the page's main correction visually so a reader can't confuse the two systems again. - concepts/request-lifecycle.md — sequence diagram covering the full /getModelBysId + /getBusinessDataByFormcustomId round-trips, with the AuthorizationInterceptor + RequestAddParamUtil preamble, the ADMIN-skips-jurisdiction branch, and which service makes which DB call. Supplements (doesn't replace) the ASCII layout diagram above it. - concepts/customization-layers.md — colour-coded vertical stack (system → tenant → user) showing the five overlay tables (gdsconfigformmaster / personalize / slave / customslave / userslave) flowing into the merged form delivered to the SPA. - slices/01-hello-world.md — full save-flow sequence: addSysLocking optimistic-lock → addUpdateDelBusinessData → BusinessBaseServiceImpl per-row dispatch → DB write (with sTableNameList tenant-bypass callout) → BusinessCleanRedisData synchronous @CacheEvict → grid re-fetch. Built from the live capture in commit 054efbef. Fixed: - concepts/index.md — the existing "metadata change → AMQ → xlyErpJmsConsumer → REDIS" arrow chain implied JMS busts the cache, which the cache-invalidation pass already corrected in prose. Diagram updated to show the two distinct paths: synchronous @CacheEvict directly to Redis from xlyEntry, plus the separate domain-events JMS path that runs PRO_ERPMERGEBASE* against MySQL (NOT cache invalidation). Caption added pointing readers at cache-invalidation.md. All 6 diagrams render as <pre class="mermaid"> via Material for MkDocs's mermaid integration; mkdocs --strict green.
-
Drove the BACK SPA's universal-CRUD save end-to-end via real keystrokes + clicks. Captured: - Network: POST /xlyEntry/business/addUpdateDelBusinessData ?sModelsId=13 → 200 OK (sModelsId only as query, no path variable — matches the SPA bundle's saveData call site: business/addUpdateDelBusinessData?sModelsId=" + sModelsId). - DB side-effect: directly after save, gdsformconst.sChinese for sId=20260123… returned the modified value with the typed audit- tag suffix (since reverted). Empirical proof that the body's updateData[].column.sChinese landed in the named column on the named sTable — the universal-CRUD path verified end-to-end. - Body shape: still rests on Javadoc + the SPA bundle's value parameter. The exact byte sequence the SPA serializes wasn't captured because the SPA's whatwg-fetch polyfill caches the XMLHttpRequest constructor at startup and bypasses any post- startup XHR monkey-patch (constructor wrapping, prototype override, fetch hook all silently bypassed). Documented this technical reason inline. - Pre-save addSysLocking POST also confirmed in the same network capture (optimistic-lock flow already documented in internal.md). Item 3 (SQL-layer capture from syslog4j / MyBatis debug log) demoted to "Future-work backlog" — the dev DB's logging level doesn't include MyBatis statements; closing it requires a deployment with MyBatis debug logging enabled.
-
Cross-verified every load-bearing claim against current src/db. Two real defects found and fixed; everything else holds. Fixes: - tech-stack.md HikariCP row: claim was "8 files reference com.zaxxer.hikari (xlyApi=6, xlyInterface=2)". Empirical recount on the cleanup branch: only 3 files import HikariDataSource (xlyApi=2: MasterDataSourceConfig + SlaveDataSourceConfig; xlyInterface=1: MasterDataSourceConfig). Updated the cell to match. - slices/01-hello-world.md "Open verification items" had two items numbered 3 (a copy/paste artefact from the Pass-E live-trace edit). Renumbered the second to 4, fixed the cross-ref to point at the actual section anchor (#4-user-edits-a-row-clicks-save), and rewrote the closing one-liner so it names the items that are still open (2 + 3) rather than the original v1 framing. Re-verified (no change needed): - All cited line numbers in BusinessBaseController.java (63, 65, 105, 107, 165, 167) and BusinessBaseServiceImpl.java (162, 165, 181, 196, 246, 325-327, 1014, 1078, 1250, 1738, 1824) still accurate. - BusinessGdsconfigformsServiceImpl.java:209 @Cacheable still reads the documented value/key pair. - RequestAddParamUtil line counts: 56 (xlyPersist), 57 (xlyApi). - DB count claims: 1358 gdsmodule, 124,524 kpimaster, 2986 gdsformconst, 0 gdsconfigformcustomslave, 311 views, 901 tables, 1687 procs, 177 functions, 18 customer override dirs, 305 viw_* views, 19 leaky. - BI/management line counts: CharServiceImpl 2219, KpiServiceImpl 833, BusinessModelKpiServiceImpl 901, all 10 Gds*ServiceImpl line counts. - Cache regions: 17 in CleanRedisServiceImpl matches the wiki. - xlyPlc: 5 java files + 9 yml profiles. xlyEntity: 22 @Document. - EntryApplicationBoot.java:22 @EnableCaching, :23-24 SecurityAutoConfig exclude — both still where the wiki says. - act_*/biz_flow/biz_todo_item/gdsmoduleflow all still 0 rows (Activiti is wired-but-idle as the activiti.md page says). - gdsconfigtbmaster drift: 11 of 307 sTbName values unresolved (3.6 %). - All 6 BACK framework-builder admin pages (系统模块配置, 数据表内容 配置, 界面显示内容配置, 接口自定义配置, 系统常量配置, 系统权限 配置, etc.) referenced consistently across wiki. - Cross-page consistency on all key facts: gdsjurisdiction-as-key vs sysjurisdiction-as-table; sTableNameList 4-table tenant-bypass exception; Spring RedisCacheManager (NOT JMS) is the cross-node cache mechanism; xlyPlc as plugin; xlyFace in-build-out-of-doc- scope; the 5-key composite (formData, gdsformconst, gdsjurisdiction, billnosetting, report). - mkdocs --strict green. - nav matches filesystem (no orphans).
-
Live findings from BACK + FROUNT browser session: - /business/addSysLocking: undocumented optimistic-lock endpoint (POST, called when entering edit mode; handler at BusinessBaseController.java:400-407). Added to internal.md universal-CRUD table. - BACK admin sidebar fully enumerated (10 modules) and mapped to backing form-master sTbName + owning service. 8/10 are framework primitives covered elsewhere; 常用操作配置 has no gdsconfigformmaster row in this dev DB (SPA-side admin special-case); 图表配置 is gdsconfigcharmaster/slave (added to the gds prefix entry in modules-forms-vtables.md). - FROUNT login confirmed; this dev DB exposes only 4 sidebar modules (2 are AI/LLM out-of-scope). Production tenants would carry the full business-module catalog. - Slice 1 save endpoint live-corroborated: clicking 新增 → 保存 fired POST /xlyEntry/business/addUpdateDelBusinessData?sModelsId=13 → 200 OK. (Audit-tag mutation didn't actually land because the Vue model didn't pick up our scripted input change — endpoint flowed but with original row state.) Updated slice-01 open- verification item with the partial verification. Dead-source flag (sql-templates.md): - Two `FileSqlUtil` classes coexist. xlyFlow's loader points at the 8 templates that exist on disk. xlyApi's loader names 7 templates (sInSqlStrTemple, sOutSqlStrTemple, sDataSqlTmp[Def], sJsonSqlTmp[Out], sDbPro) — NONE of them exist as files. Documented as broken-by-default; either restore templates or remove the loader. Auto-catalog regen verified accurate (gdsmodule.md columns match live DB).
-
Second commit completing the verification plan after the first commit covered Pass A + most of Pass B P0/P1 + Pass C1/C2. P1 gaps: - slices/02-multi-tenancy.md: add the four-table sTableNameList exception (gdsformconst, gdsmodule, gdsconfigformmaster, gdsconfigformslave strip tenant cols at write); rewrite query-shape section to distinguish global framework metadata from tenant-scoped overlays + business state; flag dev DB has only 8S_001 in sisversionflow despite gdsmodule.sVersionFlowCode referencing EBC-SD/EBC-RD/EBC-MDM/etc.; add live row counts (1002 untagged, 322 8S_001, 15 EBC-SD-002, …). - api-reference/internal.md, messaging.md, notifications.md verified as-is (Pass A surface fixes were sufficient, all file paths exist). P2: - slices/04-custom-field.md: close out the merge-code open item — merge is Java at BusinessBaseServiceImpl.java:246-248 (getFormSlaveData + getFormCustomSlaveData); the two views supply the master⋈slave shape, the merge itself is in Java. - slices/06-hardware.md: PlcScheduledTasks uses Spring @Scheduled cron (every 30s + every 1s), not Quartz directly. - concepts/thesis.md: fix the "four-table read" framing — actual reads are from gdsconfigformmaster (with overlays), gdsformconst, sysjurisdiction, sysbillnosettings, sysreport. Soften slice-1 reference to remove the "four-table" misframing. - slices/03-report.md, concepts/api-surface.md, customization-channels, customization-layers, semantic-fk verified clean (script/客户/ customer dirs = 18, 0 FK / 0 triggers on xly tables, both overlay views exist). P3: - reference/builder/define-form.md: rewrite cache-invalidation section to match the corrected architecture (synchronous @CacheEvict, not the JMS path). - builder/define-vtable, builder/permissions, builder/index, builder/attach-workflow, slices/07-workflow, glossary/index, reference/maintainer/index, slices/index, contributing/index verified appropriately marked deferred / consistent. Pass D consistency sweep: - Ports (8080/8090/8000/8091/8597/8598) consistent across pages. - Schema names consistently use xlyweberp_saas_ai; running-locally.md correctly documents the xlyweberp_saas vs _ai divergence. - Counts (1358 gdsmodule rows, 311 views, 1687 procs, 177 functions) consistent. - Module/Modle/Models codebase quirk consistently surfaced. - xlyPlc plugin framing consistent across index.md, tech-stack.md, slice 06. - vtable / virtual table — single canonical form ("virtual table") used in narrative; URL-style filename `define-vtable` preserved. - proc / procedure / stored procedure usage clean (long form for emphasis, short for lists). Pass E live traces (partial): - Slice 1 read flow CORROBORATED end-to-end at BACK admin/123 edition 基础版/8s. Both documented URLs captured exactly: GET /xlyEntry/business/getModelBysId/13?sModelsId=13 → 200 POST /xlyEntry/business/getBusinessDataByFormcustomId/19211681019715574676360040?sModelsId=13 → 200 including the redundant ?sModelsId=13 alongside the path variable. Updated slice-01 open verification items to mark the read item closed. - Slice 1 save flow + slices 2-6 traces deferred (would mutate shared dev DB; FROUNT enumeration declined; monthly usage limit reached). Pass C3 frontend inventory (partial): - BACK admin sidebar = 10 framework-builder modules: 系统模块配置, 数据表内容配置, 界面显示内容配置, 接口自定义配置, 系统常量配置, 系统权限配置, 常用操作配置, 用户信息配置, Mysql脚本配置, 图表配置. - 8/10 covered by existing wiki pages; 2 silent (常用操作配置, 图表配置 — admin BACK utilities, not framework runtime). - FROUNT enumeration declined by user. -
Audit every concrete claim in the 41 hand-written en pages against the three primary sources (DB, source on cleanup branch, source-tree inventory). Fix divergent claims in place; preserve framing where verified. Substantive corrections: - request-lifecycle / runtime / slice 01: the metadata read sources from five tables/families (gdsconfigformmaster + overlays, gdsformconst, sysjurisdiction, sysbillnosettings, sysreport), not four. The map key `gdsjurisdiction` is misleading — the per-user grant read queries `sysjurisdiction`; `gdsjurisdiction` is the builder-side action catalogue. `gdsformconst`, `gdsconfigformmaster`, `gdsconfigformslave` are NOT tenant-scoped; they filter by form-id only. - multi-tenancy: four metadata tables (gdsformconst, gdsmodule, gdsconfigformmaster, gdsconfigformslave) are an explicit exception to the "every table tenant-scoped" promise — `sTableNameList` strips sBrandsId/sSubsidiaryId from writes against them. - sSaveProName / sSaveProNameBefore are pre/post-save HOOKS on top of the always-running base path (BusinessBaseServiceImpl.add/update), not either/or branches. Default add/update path is in BusinessBaseServiceImpl, not AddDelUpdCommonServiceImpl. - cache-invalidation: redis cache is cleared synchronously in BACK via @CacheEvict on CleanRedisServiceImpl during save. The JMS CHANGE_GDS_MODULE queue triggers PRO_ERPMERGEBASEGDSMODULE (base-data merge), NOT cache invalidation despite the name. Cross-node coherence open question (no custom CacheManager bean configured). - messaging: enumerate all 24 P2pQueue destinations grouped by intent; fix CHANGE_GDS_MODULE description; clarify single Consumer.java with 24 @JmsListener methods (not 24 listener classes). - API paths: /checkflow lowercase (mapping value, not class name); /procedureCall/doGenericProcedureCall (not /business/genericProcedureCall*). - tech-stack: Druid 6 java imports + 16 yml mentions (was 25 conflated); fastjson per-module xlyInterface 9 (was 10); commons-lang3 39 (was 41); @Document classes 20 PLAT_* + 2 DIKE_TEST* (was "all PLAT_*"); xlyPersist activiti hit is IdGen.java (was BaseDao.java); add Springfox to declared-but-no-imports table; reconcile module list to 11 framework core + xlyPlc plugin + xlyPlatConstant utility. - index.md: clarify xlyFace as "in build, not documented"; add xlyErpTask / xlyPlatTask scheduler bullet; correct MongoDB framing (caller is in xlyPersist with no consumers, not xlyPlat*); add xlyPlc note; extend backup-table OOS to cover *_copy1 / *_history / *YYYYMMDD[HHMMSS]. - deployment.md: split deployable Boot apps from library modules; enumerate 12 commented-out includes (was 3); remove xlyPlatConstant from out-of-scope Plat* list; split profile permutations by service. - activiti.md: add xlyApi to 5.17 dependency list; replace speculative BPMN path hint with verified state; name actual ActivitiConfig.java; note act_id_* are views projecting xly users into Activiti shapes. - api-reference/external.md: fix bearer-token validation flow (sysapibrand via AES-decrypted corpid, not sysapithirdtoken); /online/* are page renders not API execution; /pro/* mostly returns Thymeleaf views; mark sysapidbtodb as xlyFlow-owned; /token/getToken accepts GET and POST. - api-reference/webhooks.md: add Swagger Docket caveat (UI shell ships but no Docket bean → /v2/api-docs effectively empty); flag /send/sendQw as stub (returns "ok"). - slices/03-report.md: fix dir path xlyEntry/com/xly/report/ → xlyEntry/com/xly/web/report/; reframe PrintReportControllerOld as dead source (file body fully commented out). - concepts/modules-forms-vtables.md: add 22-prefix glossary table (gds/sys/sis/sft/ele/mft/sal/quo/acc/pur/ops/cah/sgd/ept/mit/pit/qly/ kpi/udf/viw_/plat_/ai_/act_/qrtz_) so a maintainer can enumerate business-data domains at a glance. - concepts/master-slave.md: disambiguate document-row pattern from DataSource master/slave (different concept, name overlap). - proc-dispatch.md: add proc-name molds (Sp_*_BeforeSave/AfterSave/ SaveReturn, sp_btn_*, PRO_ERPMERGE*) + function-layer paragraph (Fun_*/Fn_*/get_*; SQL-called, not Java-dispatched). - concepts/index.md: schema label MySQL\nxlyweberp → xlyweberp_*. Pass E (live behavioural traces) deferred — source/DB-side audit was thorough; live traces best done as a follow-up sweep against a running instance.
-
Verified every factual claim in the hand-written prose against the codebase under ../xly/ and the live xlyweberp_saas_ai schema, and fixed the drift: - semantic-fk: clarified — zero FKs on xly tables; the ones that exist are all on bundled Activiti / Quartz schemas, which the runtime doesn't join through. - multi-tenancy / runtime / slice 2: corrected RequestAddParamUtil shape (16 keys, 56 lines), noted the parallel xlyApi copy. - slice 1: corrected line ranges for addUpdateDelBusinessData; clarified that sTableNameList is a cache-invalidation gate, not an authorisation gate; corrected the gdsroute claim — unregistered paths are NOT 404'd server-side, the SPA uses gdsroute as a client-side whitelist (web-verified). - runtime: fixed controller package paths (Gdsmodule/Gdsconfigform/Gdsconfigtb live in systemweb/, not businessweb/); added CheckFlowController. - sql-templates / proc-dispatch: 8 scaffolds, not 7 (sSqlStr.sql). - master-slave: removed table names that don't exist (accOrderCostAnalysisMaster, quoQuotationCalc, mftWorkOrderCalc, mftWorkOrderSlaveMoney); added the *_tmp family that does. - permissions: full rewrite. The original page described gdsjurisdiction as a per-(module, role, button) rule table backed by empty plat_base_authority_* lookups; reality is gdsjurisdiction is a per-module catalog of buttons/actions, with sysjurisdiction carrying the actual role/user grants. - Removed environment-specific facts (row counts, sizes, timestamps, per-DB enumerations) so the wiki documents the framework, not one particular DB snapshot. Auto-catalog generator (en/scripts/gen_catalog.py): - Rewritten to query MySQL directly via ~/.my.cnf (replaces the recon/*.tsv pipeline). - Stripped ephemeral fields from output (Rows, Data size, Created, Updated on tables; Created, Last altered on routines; Definer on views). - Strips the schema-name prefix from VIEW_DEFINITION so view bodies are portable across deployments. - Wipes and rewrites docs/auto-catalog/{tables,views,procedures,functions}/ on each run. - Auto-catalog regenerated. New API Reference chapter (5): - concepts/api-surface.md introduces the three-tier design (xlyEntry internal, xlyApi external, xlyInterface webhooks). - api-reference/{index,internal,external,webhooks,messaging}.md cover each surface, with the data-driven /api/invoke{sApiCode} pattern, sysapi schema, token flow, and the SpringFox Swagger UI location on xlyInterface. - mkdocs nav: chapters renumbered (Auto-Catalog → 6, Glossary → 7, Contributing → 8); glossary/contributing wrapped as section indexes to render correctly under navigation.sections. Other: - Bilingual top-level README (Chinese + English). - requirements.txt: pymysql added for the new generator. -
Documents the xly (小羚羊) printing-industry ERP framework. Built with MkDocs Material; CJK search via jieba; 3,076 auto-generated catalog pages from recon/*.tsv plus hand-written prose for the framework's core mental model and end-to-end vertical slices. Phase 0 recon: stack, schema shape, framework metadata layer, scope. Phase 1 wiki: scaffold + auto-catalog + Slices 1-6 (Slice 7 deferred). Slice coverage: 1. CRUD module (Hello World) — observed network + cited source 2. Multi-tenancy & product editions — sBrandsId/sSubsidiaryId/sVersionFlowId 3. View-backed module (read-only report) 4. Custom field overlay (gdsconfigformcustomslave) 5. Per-customer SQL override (script/客户/<customer>/) 6. Hardware integration (xlyPlc, optional) 7. Workflow (deferred — Activiti tables empty in dev DB) Concepts: thesis, modules-forms-vtables, master/slave, semantic-FK, customization channels & layers, multi-tenancy, request lifecycle. Reference (Builder): define-form, define-vtable, permissions, attach-workflow (deferred). Reference (Maintainer): runtime, proc-dispatch, cache-invalidation, sql-templates, deployment, activiti.