245 Commits

Author SHA1 Message Date
11475d31c3 feat(balance): invalidate llmage Redis balance cache after recharge 2026-08-04 18:36:10 +08:00
16fdf90513 fix: billing.ui 查询按钮 urlwidget 传参,修复点击无反应 2026-07-17 17:59:09 +08:00
c0b91ec050 Revert "fix: billing.ui 查询按钮改用 urlwidget 传参,修复点击无反应"
This reverts commit ebac31f5877a97166dd13f0bcfd11d009c2b612a.
2026-07-17 17:40:01 +08:00
ebac31f587 fix: billing.ui 查询按钮改用 urlwidget 传参,修复点击无反应 2026-07-17 17:37:33 +08:00
da4b0877c8 fix(accounting): remove date column, sort by timestamp, direction 借/贷 2026-07-17 16:05:05 +08:00
b8541d6730 fix(accounting): remove cheight from Tabular for auto row height 2026-07-17 15:50:43 +08:00
78345c758c fix(accounting): use relative URL /accounting/billing_download.dspy to avoid Jinja2 escaping 2026-07-17 15:49:49 +08:00
277e0a7aec fix(accounting): use single quotes in CSS selector to avoid JSON escaping issues 2026-07-17 15:48:44 +08:00
3cbde03d6e fix(accounting): use DOM querySelector for date values instead of getWidgetById 2026-07-17 15:47:29 +08:00
696c1b9432 fix(accounting): revert acc_dir to raw 0/1 to avoid charset issues 2026-07-17 15:43:53 +08:00
07086034be perf(accounting): remove summary from billing, fix acc_dir 0=借/1=贷, add DB index 2026-07-17 15:35:03 +08:00
8976ab6d90 fix(accounting): summary shows #shortid only, remove redundant subject prefix 2026-07-17 15:21:37 +08:00
515059db9f fix(accounting): human-readable summary — subject_name #short_id instead of raw UUIDs 2026-07-17 15:20:37 +08:00
1152e02a27 perf(accounting): single query with window functions instead of two separate scans 2026-07-17 15:17:56 +08:00
6986ade835 fix(accounting): use Text widget instead of Button for download 2026-07-17 15:14:34 +08:00
03cb4049f4 fix(accounting): add padding/borderRadius to download button, remove HBox height constraint 2026-07-17 15:13:08 +08:00
e125f6ab8d fix(accounting): use bricks-native bgcolor/color instead of css for download button 2026-07-17 15:12:10 +08:00
d4e32a2292 fix(accounting): wire up download button, fix LEFT JOIN in download DSPY 2026-07-17 15:11:16 +08:00
9a6723378b fix(accounting): billing.dspy — keep page in ns for Tabular paging, extract DictObject correctly 2026-07-17 14:48:07 +08:00
4ef0808004 fix(accounting): billing.dspy — remove 'page' from ns to prevent sor.sqlExe auto-paging return DictObject 2026-07-17 14:44:27 +08:00
31c348878a fix(accounting): billing.dspy — convert DictObject to list when sor.sqlExe returns non-list 2026-07-17 14:43:27 +08:00
0e750b6d31 debug(accounting): add type logging for billing rows 2026-07-17 14:41:22 +08:00
91609f3606 fix(accounting): billing query uses LEFT JOIN subject to avoid dropping rows with missing subject 2026-07-17 14:39:52 +08:00
950df9a4c2 bugfix 2026-07-16 18:36:12 +08:00
47844253fe fix(billing): separate ns for stats query, avoid sqlor ns mutation 2026-07-16 17:32:05 +08:00
1ffdda5ffe fix(billing): add acc_date to aggregate query for sqlor ORDER BY
sqlor wraps every sqlExe with row_number() over(order by acc_date desc).
Aggregate queries without acc_date in SELECT fail with:
  Unknown column 'acc_date' in 'ORDER BY'
Fix: add min(acc_date) as acc_date to satisfy sqlor wrapper.
2026-07-16 17:30:52 +08:00
fba38804de fix(billing): submit_text→submit_label, wid→self, fix indentation
- submit_label is the correct InlineForm option (not submit_text)
- Use wid:self instead of explicit widget id
- binds was incorrectly indented inside options
2026-07-16 16:59:51 +08:00
f7f9581cd9 fix(billing): InlineForm target can't find sibling Tabular
InlineForm and Tabular are siblings in the same VBox. Default
getWidgetById() searches downward from the source widget, missing
siblings. Use 'app.' prefix to resolve from root.
2026-07-16 16:28:25 +08:00
a65422d06b fix: move fetch_forex_rates to PATHS_ANY for cron access 2026-07-14 10:44:58 +08:00
f9cb644e07 fix: currency/exchange_rate DDL 加 utf8mb4_unicode_ci 防止 collation mismatch 2026-07-10 11:40:03 +08:00
8f09fc43df fix: remove updated_at from exchange_rate INSERT — column not yet added 2026-07-09 11:49:10 +08:00
5f752a6287 feat: BOC forex rate fetcher — /api/fetch_forex_rates.dspy 2026-07-09 11:46:35 +08:00
898c215f9d chore: update migration SQL for all 5 DBs + RBAC for currency/exchange_rate CRUD 2026-07-07 17:44:47 +08:00
3f6c71b4d5 feat: multi-currency support — currency/exchange_rate tables + migration 2026-07-07 15:43:01 +08:00
b95a57fd34 fix: submit改用method:render,零JS代码 2026-07-01 11:56:49 +08:00
5b9619c850 fix: InlineForm submit绑定修正,wid+getWidgetById替代this 2026-06-30 17:52:22 +08:00
60e9e3c9b3 fix: Form→InlineForm, type→uitype:date, flex+cheight增大显示 2026-06-30 17:39:20 +08:00
a7d1aa170e fix: billing.ui用{% set %}变量替代"转义,避免Jinja2报错 2026-06-30 17:24:20 +08:00
d3310bfcc1 fix: 修正刷新目标为 app.sage_main_content
Sage 主内容区 ID 是 sage_main_content 而非 main_content。
global_menu.ui 确认: target = app.sage_main_content
2026-06-29 13:24:43 +08:00
982b0ad7a7 fix: 授信表单提交成功后自动刷新客户额度管理页面
set_credit_form.ui 添加 submited 事件绑定:
Form 提交成功 → 替换 main_content 为最新 credit_manage.ui
PopupWindow 同时因 dismiss_events:["submited"] 自动关闭

适用于新增授信和调整授信两个场景
2026-06-29 13:18:44 +08:00
bda9e7fc00 feat: credit_limit 加 grant_orgid 授予机构字段,支持多租户
credit_limit 新增 grant_orgid 字段,区分「客户所属机构(orgid)」
与「授予信用的机构(grant_orgid)」。多租户下,操作员为客户授信时:
- orgid = 客户机构ID
- grant_orgid = 操作员所属机构ID

修改:
- models/credit_limit.json: 加 grant_orgid 字段(VARCHAR(32), default 0) + 索引
- creditlimit.py:
  get_credit_stats/get_all_customer_credits: WHERE orgid → WHERE grant_orgid
  set_credit_limit: 加 grant_orgid 参数
- set_customer_credit.dspy: 写入时 orgid=客户orgid, grant_orgid=操作员orgid;
  三处UPDATE同步加 grant_orgid
- credit_summary.dspy: WHERE orgid → WHERE grant_orgid

get_my_credit_list(客户自看)保持按 cl.orgid 过滤不变。
2026-06-29 12:46:49 +08:00
17554a1038 bugfix 2026-06-29 12:14:04 +08:00
b880673d79 fix: credit_manage 弹窗提交后不关闭导致重复提交
set_credit_form.ui 用了无效的 actiontype:'close' 来关闭弹窗,
表单提交后弹窗不关,操作员以为失败重复提交。

修复:
- set_credit_form.ui: 移除无效的 actiontype:'close' bind
- credit_manage.ui: popup_options.dismiss_events 加上'submited',
  Form 提交成功后自动关闭弹窗(2处弹窗:新增授信 + 调整)
2026-06-29 11:55:39 +08:00
77fd157ab7 fix: revert get_credit_limit.dspy to CRUD auto-generated, add to .gitignore
The file was manually rewritten in cd26eb1 instead of modifying the
CRUD definition (json/credit_limit.json) and regenerating.

Changes:
- Reverted get_credit_limit.dspy to xls2crud-generated version
  (includes JOINs for _text fields from model codes, DBFilter pattern)
- Re-generated index.ui via xls2crud
- Added auto-generated credit_limit files to .gitignore
  (index.ui, get/add/update/delete_credit_limit.dspy)
- Removed them from git tracking

Future modifications should go through json/credit_limit.json
or models/credit_limit.json, then regenerate.
2026-06-29 11:35:24 +08:00
cd26eb1852 fix: 重写get_credit_limit移除default_filterjson; set_customer_credit加try/except防Duplicate 500 2026-06-29 10:55:12 +08:00
4ca0243506 fix: 新增授信改为UPSERT,避免accountid唯一约束冲突;uuid改为getID 2026-06-29 10:51:16 +08:00
31ef3531c8 fix: add dismiss_events to all PopupWindows in accounting module
All PopupWindows loading Form widgets now include 'dismiss_events: ["cancel"]'
so the Form Cancel button properly closes the popup instead of doing nothing.

- credit_manage.ui: '新增授信' and '调整' popups
- error_accounting.ui: '报告错帐' popup
- myaccounts.ui: '充值' and '明细' popups

Ref: bricks-framework skill — PopupWindow dismiss_events pattern
2026-06-29 10:48:29 +08:00
40f037c517 fix: proxy_recharge.ui Form Cancel button now resets form fields
The Form's Cancel button dispatches a 'cancel' event but no handler
existed. Added a bind to call reset_data() when Cancel is clicked,
which clears the form fields (username and amount inputs).
2026-06-29 10:43:31 +08:00
d8cfd06c4c fix: 新增客户授信表单移除id字段,编辑时id通过URL query参数传递 2026-06-29 10:42:28 +08:00
Hermes Agent
503ae5434d fix: credit_limit.orgid存操作员orgid非客户orgid
- accountid已关联客户,orgid应为创建者(reseller)的orgid
- 修复credit_manage.ui查询0条记录问题
2026-06-24 17:41:27 +08:00