|
|
26efde3051
|
fix: promote页移到RBAC any角色(无需登录),客户扫码可用
|
2026-07-05 10:58:29 +08:00 |
|
|
|
4b7e501ee0
|
fix: promote.dspy替代promote.ui绕过模板引擎500
|
2026-07-05 10:42:36 +08:00 |
|
|
|
bea89dadd5
|
fix: promote.ui加Jinja2注释标记强制走模板引擎路径
|
2026-07-05 10:40:45 +08:00 |
|
|
|
5c2079a2f1
|
fix: promote.ui去掉Jinja2 entire_url避免独立页面上下文缺失
|
2026-07-05 10:39:09 +08:00 |
|
|
|
0ceb2b84c1
|
fix: QR生成移到async Python函数,修复DSPY中async/await不可用问题
|
2026-07-05 10:36:12 +08:00 |
|
|
|
0256583cc1
|
fix: discount_promo_code sale_id改为nullable避免CRUD自动生成add报500
|
2026-07-05 10:32:11 +08:00 |
|
|
|
85f9979051
|
fix: in_plan整数比较==1而非=='1'
|
2026-07-04 20:35:23 +08:00 |
|
|
|
8173fb603b
|
fix: title用json.dumps整个字符串避免空值破坏JSON
|
2026-07-04 20:34:30 +08:00 |
|
|
|
c3cad2140f
|
fix: 用json.dumps包裹所有动态值确保JSON安全,in_plan用字符串比较'1'
|
2026-07-04 20:33:56 +08:00 |
|
|
|
ad56bd4b37
|
fix: index.ui literal \t → actual TAB for valid JSON output
|
2026-07-04 20:25:17 +08:00 |
|
|
|
90e2fd0c0c
|
fix: get_discount_info查询discount_marketing表而非discount表
|
2026-07-04 20:23:07 +08:00 |
|
|
|
cd69111655
|
fix: add p.id to SELECT for sqlPaging default ORDER BY id
|
2026-07-04 19:59:53 +08:00 |
|
|
|
da88b99ca1
|
fix: hardcode base_discountid to avoid sqlExe KeyError in DSPY
|
2026-07-04 19:58:55 +08:00 |
|
|
|
9645d397b6
|
fix: remove ns['sort'] to avoid sqlPaging outer ORDER BY conflict
|
2026-07-04 19:56:56 +08:00 |
|
|
|
9c7a39e519
|
fix: remove inner ORDER BY to prevent sqlPaging conflict
|
2026-07-04 19:55:48 +08:00 |
|
|
|
7a267558a3
|
fix: DSPY sort alias pc.name→pc_name for sqlPaging compatibility
|
2026-07-04 19:53:43 +08:00 |
|
|
|
bc8af7a4cf
|
fix: 产品折扣设置显示基准折扣(1.0)并标记方案内产品
- get_discount_setting_products: LEFT JOIN基准折扣方案_HeaX, COALESCE优先方案折扣, 新增in_plan字段
- get_products_with_discount.dspy: 同步加基准折扣COALESCE
- index.ui: 折扣默认1.0, 新增'✓方案内'标记列
- save_discount: old_discount默认1.0
|
2026-07-04 19:49:02 +08:00 |
|
|
|
51a1616b9f
|
fix: restore IS NULL OR * to cover both conventions; keep direct dd.discount without GROUP BY
|
2026-07-03 18:06:56 +08:00 |
|
|
|
c39e54f379
|
fix: dspy same fix — remove IS NULL, remove GROUP BY, use dd.discount directly
|
2026-07-03 18:05:41 +08:00 |
|
|
|
5e90686fbd
|
fix: base discount query — customerid default is '*' not NULL, remove IS NULL and unnecessary GROUP BY
|
2026-07-03 18:05:14 +08:00 |
|
|
|
33cd1d287d
|
feat: 营销方案产品折扣设置(独立于普通折扣方案)
index.ui: 显示所有产品 + 基准折扣(全部用户) + 方案折扣, 标志'已加入/未加入'
get_products.dspy: 左联全部用户基准折扣 + 营销方案专属折扣
save_discount.dspy: 验证 0<新<基准, upsert 到 discount_detail
init.py: get_marketing_discount_products + get_marketing_info
marketing_list.json: toolbar 指向新页面
|
2026-07-03 16:05:21 +08:00 |
|
|
|
ae6c547aff
|
fix: CRUD endpoint return format - remove json.dumps, use widgettype format
|
2026-07-03 14:50:31 +08:00 |
|
|
|
53eaa966ae
|
feat: 客户归属支持多分销商 + 阶梯折扣表
discount_customer_bind:
- UNIQUE(customerid) → UNIQUE(customerid, resellerid)
一个客户可绑定多个分销商
- bind_type: 加 3=域名注册
- 索引重命名: idx_dcb_customer → idx_dcb_customer_reseller
reseller_discount_tier (新增):
- 分销商阶梯折扣: name, min_amount, max_amount, discount_pct
- 按累计消费自动匹配档位
|
2026-06-30 15:45:15 +08:00 |
|
|
|
9d4c83a25f
|
fix: 客户折扣不得高于全部用户折扣
|
2026-06-30 14:20:46 +08:00 |
|
|
|
1b20b28e7e
|
fix: 营销方案产品明细指向discount_setting(同折扣方案subtable模式)
|
2026-06-30 11:40:40 +08:00 |
|
|
|
9f4901c945
|
fix: 无默认方案时创建客户方案报错提示
|
2026-06-30 11:35:25 +08:00 |
|
|
|
d08f6fb289
|
fix: 删除折扣产品明细菜单; create校验customerid并从默认方案复制detail
|
2026-06-30 11:30:23 +08:00 |
|
|
|
02f00c6739
|
feat: 顶部显示折扣名称和客户名称
|
2026-06-29 17:02:57 +08:00 |
|
|
|
7e3af2d9b8
|
fix: 所有Message加timeout, NaN过滤
|
2026-06-29 16:59:16 +08:00 |
|
|
|
34843b6634
|
fix: 过滤NaN/nan/null/空值防MySQL报错
|
2026-06-29 16:58:37 +08:00 |
|
|
|
f14eb4f704
|
fix: UiFloat用urlwidget+datawidget:self; dspy对比old_discount跳过无变化
|
2026-06-29 16:55:07 +08:00 |
|
|
|
92e1ce6dbb
|
fix: focusin触发setup, setInterval扫描input挂DOM blur
|
2026-06-29 16:39:52 +08:00 |
|
|
|
817cb354da
|
fix: Jinja2变量避免"转义, script用save_url+disc_id模板变量
|
2026-06-29 16:35:13 +08:00 |
|
|
|
885b915d28
|
fix: JSON闭合VScrollPanel, urlwidget→script+fetch读input值
|
2026-06-29 16:32:02 +08:00 |
|
|
|
b3dabcf0f6
|
fix: 用widgettype:UiFloat+urlwidget替代Form+JS
|
2026-06-29 16:27:48 +08:00 |
|
|
|
d536490599
|
fix: setInterval轮询替代setTimeout,等cell就绪再创建UiFloat
|
2026-06-29 16:21:58 +08:00 |
|
|
|
18eea5b5f9
|
fix: JS直接new bricks.UiFloat+blur事件,去Form
|
2026-06-29 16:21:21 +08:00 |
|
|
|
c126ca9021
|
wip: Form→VBox+uitype:float
|
2026-06-29 16:20:12 +08:00 |
|
|
|
3896a8145e
|
fix: Form简化,margin:0,padding:0,去id,精简script
|
2026-06-29 16:18:35 +08:00 |
|
|
|
3bafa4425a
|
fix: Form添加padding:0 12px与header对齐
|
2026-06-29 16:15:25 +08:00 |
|
|
|
65bbe39477
|
fix: changed→blur, 移除css:childrensize
|
2026-06-29 16:11:27 +08:00 |
|
|
|
0eba657ce4
|
fix: 移除ORDER BY
|
2026-06-29 15:57:57 +08:00 |
|
|
|
0c5f0cfcc3
|
fix: sort改为list格式
|
2026-06-29 15:56:30 +08:00 |
|
|
|
52d48c964a
|
fix: ORDER BY改用$参数化
|
2026-06-29 15:56:09 +08:00 |
|
|
|
dafa2d5eb2
|
fix: request._run_ns.params_kw
|
2026-06-29 15:30:14 +08:00 |
|
|
|
6e6a6a14f0
|
fix: discountid改用request._params_kw(同accounting模块方式)
|
2026-06-29 15:28:53 +08:00 |
|
|
|
6000ea7b01
|
fix: discountid改用request.query.get, aiohttp标准方式
|
2026-06-29 15:26:11 +08:00 |
|
|
|
a2aa95ef94
|
fix: _run_env→_run_ns
|
2026-06-29 13:35:22 +08:00 |
|
|
|
89d116acfd
|
refactor: discountid获取简化为单一路径request._run_env.param_kw
|
2026-06-29 13:22:56 +08:00 |
|
|
|
b20c580193
|
fix: discountid优先从request._run_env.param_kw获取
|
2026-06-29 13:18:18 +08:00 |
|