• 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).
    zichun authored
     
    Browse File »
  • 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.
    zichun authored
     
    Browse Code »

  • Plan: /Users/reporkey/.claude/plans/noble-tumbling-sparkle.md
    
    Inventory: 33 hedge entries / open verification items across 12 hand-
    written pages, clustered into 5 groups by why-they're-not-verified.
    
    Cluster A — closed inline by reading source / running DB queries:
    
    - slices/02-multi-tenancy item 1: edition gating is **not** sVersionFlowId
      → sisversionflow. Verified: `grep sVersionFlowId xly-src --include='*.java'
      --include='*.xml'` returns ZERO mapper hits. The actual filter is
      `MenuChildServiceImpl.getBuMenuSql` line 64: `AND m.sId in
      (#{sVersionFlowId... wait sVerifyLicense})`. sVerifyLicense is sourced
      from the TrueLicense-bound `VerifyLicense.getModelAllList()` and
      injected via xlyApi RequestAddParamUtil:50 or controller-level param
      assembly. sVersionFlowId/Code are catalogue tags, NOT runtime gates.
      Wiki body of "How modules are filtered per edition" rewritten.
    - slices/02 item 2: closed; cross-link to the activiti.md rewrite that
      documents Activiti is wired-but-idle.
    - slices/02 item 3: session→tenant chain mapped:
      AuthorizationInterceptor.preHandle → RedisTokenManager.getToken
      (AES-decrypts bearer, checkToken validates Redis at <sLoginType><userId>)
      → @CurrentUser via CurrentUserMethodArgumentResolver →
      RequestAddParamUtil.addParams injects 16 keys.
    - slices/04 item 3: bVisible semantics closed.
      BusinessGdsconfigformsServiceImpl.java:413-433 — customslave row
      matches base by sControlName/sName, REPLACES base. Lines 446-468 —
      user-overlay then explicitly sets bVisible=false at line 464 when
      user-row hides the field. Hides at either layer; scope differs
      (per-tenant vs per-user).
    - slices/05 item 1: DbToDbServiceImpl is inter-DB sync (getData/
      getDataDetail/etc. over Druid+JDBC), NOT a script-applier.
      `grep "script/客户" xly-src --include='*.java'` returns zero. Manual
      application via mysql CLI confirmed.
    - slices/06 item 2: PlcScheduledTasks ships two @Scheduled cron methods
      (`0/30 * * * * ?` line 74, `0/1 * * * * ?` line 105). Per-profile
      tuning is parameter-side, not cron-side.
    - slices/06 item 3: xlyRxtx git history — added in commit daf581311
      ("1、添加串口功能"), commented out in cleanup branch for builds where
      serial isn't needed. xlyPlc runs without RXTX on TCP/Ethernet press
      models; serial-only models would re-enable.
    - builder/define-vtable item 1: 11 of 307 sTbName values (3.6 %) don't
      resolve to a base table. Breakdown: 4 point at views (viw_*),
      3 at procs (Sp_*), 4 at case-drift / dropped tables.
      Audit query embedded.
    - builder/define-vtable hedge: real worked example added — `包装方式 /
      SisPacking` with 10 slave columns mapped to physical columns.
    
    Cluster B — closed via live BACK browser session:
    
    - slices/04 item 1: 界面显示内容配置 (gdsmodule.sId=11, /jmnrpz)
      renders three form-master panels. Third panel
      (sId=19211681019715596285250620, sTbName=gdsconfigformcustomslave)
      is the customslave editor. Verified live via clicking the menu and
      inspecting the GET /business/getBusinessDataByFormcustomId call.
    
    Cluster D — left in place with "Deferred (needs populated DB)" admonition:
    
    - slices/03 item 1 (view-with-print-template): no view-backed forms
      with a sysreport row — DB query returns 0.
    - slices/04 item 4 (real customslave example): COUNT(*) = 0.
    - slices/07 stub (active workflow): act_re_procdef = 0; bCheckflowCheck
      hard-disabled regardless.
    - builder/attach-workflow stub: same — recipe is code-derived
      hypothesis, not live-verified.
    
    Cluster E — left in place with "Deferred (outside repository)" admonition:
    
    - slices/06 item 1 (wire protocols): vendor docs, not source.
    - deployment.md "Open: production URL routing": nginx config in
      deployment ops, not the codebase.
    
    Cluster F — converted to "Future-work backlog" callouts:
    
    - slices/03 hedge "future revision should pick a module with print
      template": demoted to a future-work callout adjacent to the open
      item.
    - slices/05 items 2 & 3: re-cast as "Future-work backlog item — not a
      verification claim" with the workable command/mitigation noted.
    - concepts/customization-channels line 66: rephrased — the choice is
      about *runtime divergence visibility in source control*, not
      maintainer opinion.
    
    Bonus closure:
    - slices/03 item 3 (tenant-leaky views): DB audit returns 19 of 305
      viw_* lacking sBrandsId (~6.2 %). Embedded the SQL + the count.
    - slices/04 line-41 hedge ("needs verification by clicking through
      BACK"): replaced with the verified mapping from item 1.
    
    After-state: of the original 33 entries:
    - 19 newly closed with evidence,
    - 4 left as deferred-because-DB-state with concrete blocker query,
    - 2 left as deferred-because-outside-repo with concrete blocker note,
    - 4 demoted to "Future-work backlog" callouts,
    - 4 already closed in earlier passes.
    
    Build verified `mkdocs --strict` green.
    zichun authored
     
    Browse Code »
  • 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.
    zichun authored
     
    Browse Code »

  • zichun authored
     
    Browse Code »
  • 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.
    reporkey authored
     
    Browse Code »