f801507961
feat: discount promo code marketing dropdown filter by current org
2026-07-13 16:39:04 +08:00
bc9dcb25f7
chore: remove vim swap file
2026-07-13 14:33:51 +08:00
bf975ca9a7
feat: created_by/sale_id显示username; 促销码logined_userid过滤只显自己创建的
2026-07-13 14:33:45 +08:00
a71c11ecf0
fix: new_data_url从editable提升到params顶层,xls2ddl模板不认嵌套editable
2026-07-13 13:38:29 +08:00
690e36d4ff
fix: 营销方案created_by/促销码sale_id为空 — ServerEnv()→request._run_ns
2026-07-13 11:54:24 +08:00
6c8d23b986
refactor: resellerid → auto from get_userorgid(), remove from codes
2026-07-09 13:39:10 +08:00
de1e873d91
feat: add get_min_supplier_discount and get_min_distributor_discount
...
- sor_get_min_product_discount now accepts exact_match param
- exact_match=True: no wildcard/NULL fallback (supplier/distributor)
- exact_match=False (default): includes '*' and NULL fallback (customer)
- Both new functions registered in load_discount()
2026-07-06 17:15:32 +08:00
8b054f01d1
fix: bind_customer env=ServerEnv()→request._run_ns
2026-07-06 15:11:34 +08:00
34a2fecc99
fix: from discount.init import bind_customer, 绕过dspy bare function 查找失败
2026-07-06 14:55:32 +08:00
9a8d7f10aa
fix: dspy缺少return result导致返回None
2026-07-06 14:49:10 +08:00
2bbe82fd23
fix: 用dspy原生bare function(get_user/entire_url/bind_customer),去掉env间接调用
2026-07-06 14:41:20 +08:00
79494622b9
fix: env = request._run_ns 替代 ServerEnv(),修复dspy中get_user返回None
2026-07-06 14:39:44 +08:00
5762e1c361
fix: 登录URL /rbac/user/login -> /rbac/user/login.ui
2026-07-06 14:34:22 +08:00
bb5cb57d89
refactor: keep get_min_product_discount in discount, move llm_id_to_product_id to product_management
2026-07-06 14:23:57 +08:00
10fe38b4e0
feat: add get_min_product_discount and llm_id_to_product_id
...
- get_min_product_discount: find minimum discount for a product across all
active discount records (customer-specific + NULL + '*' fallback)
- llm_id_to_product_id: convert llmage.llm.id to sage.product.id
- Both registered in load_discount() for use in pricing display
2026-07-06 14:19:12 +08:00
183263eabd
fix: generate_promo_code 用 request._run_ns 替代 ServerEnv()
...
env = request._run_ns 绑定 request 上下文,env.get_user() 正确返回 userid 字符串
2026-07-06 13:37:54 +08:00
9bb5c9e506
促销码扫码流程: dspy端点改为UI公开入口,登录后绑定并跳转主页
...
- 新建 promote/index.ui: 公开入口,未登录显示登录按钮,已登录自动跳dspy
- QR URL 改为 promote/index.ui (原 promote.dspy)
- load_path.py 注册 promote/index.ui 为 any 角色
- index.dspy 绑定成功后显示返回首页按钮跳转主页
- 修复 generate_promo_code sale_id: get_user() -> get_userid()
2026-07-06 13:34:25 +08:00
ceb997da09
fix: generate_promo_qr/discount_qrcode 用 request._run_ns 替代 ServerEnv() 修复 entire_url 为 None 的500错
2026-07-06 08:09:10 +08:00
e06339f95d
feat: 客户归属管理——列出机构客户+分配销售
2026-07-05 14:44:40 +08:00
62f07bc8bb
fix: before_insert hook自动填充sale_id+resellerid; sync generate_promo_qr到site-packages
2026-07-05 14:24:13 +08:00
ab9dc4f730
fix: promote.dspy最终版——去binds避免服务端script解析,用request._run_ns.params_kw
2026-07-05 11:09:33 +08:00
3797ae1686
fix: promote.dspy加回binds用request._run_ns
2026-07-05 11:08:41 +08:00
f50284df3e
fix: promote.dspy用request._run_ns.params_kw替代params_kw
2026-07-05 11:08:02 +08:00
c5778ba79b
debug: 去params_kw直接返回硬编码表单
2026-07-05 11:07:26 +08:00
fc73c7d2d6
debug: promote.dspy去binds排查500
2026-07-05 11:06:23 +08:00
a5c01d6bed
fix: restore promote.dspy完整表单验证JSON解析
2026-07-05 11:05:37 +08:00
e83a9ae414
debug: 回退promote.dspy到最小化版本测试
2026-07-05 11:03:35 +08:00
7daff0fcd6
fix: QR URL改为promote.dspy; 恢复完整表单
2026-07-05 11:02:41 +08:00
2d6fa91ec5
debug: promote.dspy最小化排除语法错误
2026-07-05 11:00:37 +08:00
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