📌 业务目的
自动计算每个托管品种的最优定价和阶梯价,根据库存、销量、市场价等因素动态调整价格,并提报到拼团端口。这是自动定价系统的核心脚本。
📤 输出产物
① ts_auto_price_result 表更新(定价结果)
② 调用后台接口提报/修改活动
③ 企微群发送定价配置预警
④ 生成供应商定价文件Excel
📝 核心函数逻辑(3532行)
1. get_provider_info()(120-559行)
· 获取商业基础信息:起重、起重价、续重价、毛利率需求
· 获取托管品种底价:从 ts_hosted_drug + ts_drug_cost_price_log
· 获取市场低价数据:前3低价活动
· 获取品种信息:重量、件规、中包装、销量等
· 获取供应商数量和自营数量
2. cal_provider_price()(594-991行)
· 核心定价函数,计算每个品种的目标价格
· 定价逻辑:
- 无市场价:按毛利率+库存系数定价(库存充足→+5%,紧张→+10%)
- 有市场价:参考前3低价,确保竞争力(库存充足→第1低价-0.01,紧张→第3低价)
· 调整因子:
- 重货加毛:每100元/500g加1%毛利
- 箱规调整:起拼量≥80或200时加毛
- 竞争调整:自营≤5且供应商≥10时降毛
· 阶梯价计算:
- 起拼:标准起拼量
- 低起拼:起拼量高时降低起拼提价
- 高起拼:起拼量低时提升起拼降价
- 大货:起拼金额<600时计算大货起拼
3. Numba优化版本(1165-1800行)
· _cal_drug_price_loop():Numba JIT编译的核心计算循环
· cal_provider_price_fast():优化版定价函数,提速10-50倍
· test_compare_cal_provider_price():新旧方案对比测试
4. out_put_result()(994-1162行)
· 输出品种维度计算结果
· 生成总览统计:各供应商达成情况
· 识别异常高毛品种
· 按药品排名分箱统计
5. get_provider_wholesale_result()(1810-2030行)
· 获取供应商在架一口价、批购的信息
· 分类:需要调价/价格差异大/库存不足/价格无变化
· 生成批购提报&修改文件
6. create_onsale_df_scm()(2085-2182行)
· 根据数据生成SCM端提报拼团的表格
· 处理阶梯价:不限价/限价两种模式
· 计算单店采购上限
7. check_need_update()(2185-2294行)
· 检查是否需要更新价格
· 对比现有价格和目标价格
· 标记需要更新的活动
8. upload_pintuan_wholesale()(2346-2797行)
· 获取拼团端口及指定品种价格
· 并发获取:普通端口、限价端口、指定品种端口、在架活动、批购数据、夜间准入价
· 按供应商分组处理:未提报的品种提报、已提报的检查是否需要调价
· 生成提报和调价数据
9. auto_apply_update()(2818-3134行)
· 自动化提报和调价,只做指定供应商
· 提报流程:筛选准入价合适的活动 → 上传Excel → 调用后台接口
· 改价流程:
- 先改价:批量修改成团价
- 再改起拼:批量修改起订量
- 最后改阶梯价:批量修改阶梯价
· 状态处理:缺货下架、待审核上架
· 标记托管活动:所有触碰过的活动标记为托管
10. set_restrict_and_sub_type()(3175-3335行)
· 同步品种的控禁销组、供货对象
· 设置虚拟供应商
· 设置商圈
· 设置供货对象
11. send_result()(3337-3392行)
· 发送结果到企微群
· 供应商自动定价统计
· 无批购活动品种提醒
12. main()(3459-3532行)
· 串联所有功能的主流程
· 定时记录定价结果到 ts_auto_price_result
· 更新供应商托管项目数据看板
🗄️ SQL 筛选条件详解
① 获取托管品种
数据源:ts_hosted_drug(托管品种表)
筛选:is_delete = 0(未删除)
关联:ts_drug_cost_price_log(底价日志)取最新底价
② 获取在售活动
活动端口:夜间/周末/包销/通补/全天拼
库存要求:实际库存 ≥ 起订量 × 3
排除:推广活动、医械城、控销品、近效期、破损品
覆盖率:覆盖省份 ≥ 15
效期:效期剩余 ≥ 380天
③ 定价规则
· 无市场价:按毛利率+库存系数定价
· 有市场价:参考前3低价,确保竞争力
· 控销品种:保底价格 = 控销价格
· 效期品种:根据效期剩余调整毛利率
④ 提报规则
· 夜间/周末拼团:低起拼价策略
· 全天拼/通补:普通价格策略
· 必补端口:高补贴策略
· 准入价检查:夜间准入价×1.01 ≥ 最低价
⑤ 改价规则
· 先改价:批量修改成团价
· 再改起拼:批量修改起订量
· 最后改阶梯价:批量修改阶梯价
· 每900条分割上传,避免超时
📐 起拼量(min_amount)计算规则
💡 核心概念
original_qp_price = 商业的「需求起拼金额」(每个商业设定的最低拼单金额阈值,默认250)
leyao_mid_amount = 乐药中包装规格(如一盒10瓶,则中包装=10)
target_price = 计算出的目标单价
start_amount = 初始起拼量 = start_amount_group × mid_amount
① 确定初始起拼量(start_amount)
有中包装数据时:
· 起拼组数 = ceil(original_qp_price / (mid_amount × target_price))
· 初始起拼量 = 起拼组数 × mid_amount
· 如果起拼组数=1,且市场数据存在:若市场量×1.5 ≤ 初始起拼量,改用市场量重新计算
无中包装、有市场数据时:
· mid_amount 推导:市场量%3==0→/3,%4==0→/4,%10==0→10,%5==0→5,否则→1
· 若市场量×target_price ≤ 原始起拼金额:起拼量 = ceil(原始起拼金额 / (mid_amount × target_price)) × mid_amount
· 若市场量>20 且市场量×target_price≥400:同上
· 否则:起拼量 = 市场量
都没有数据时:
· 起拼量 = ceil(original_qp_price / (2 × target_price)) × 2
② 起拼价≥200元 → 尝试降低起拼量、提高单价
当 start_amount × target_price ≥ 200 时,尝试降低起拼量来提升单价:
降低规则(按优先级匹配):
· 组数%3==0:min_amount_down = 组数 × 2/3 × mid_amount
· 组数%4==0:min_amount_down = 组数 × 2/4 × mid_amount
· 起拼量%10==0:若=10→降为5,若=20→降为10,否则 ceil(量/10)/3 × 2 × 10
· 起拼量%5==0:若=5→降为3,否则 ceil(量/5)/3 × 2 × 5
· 起拼量%3==0:× 2/3
· 起拼量%4==0:× 3/4
· 都不匹配:不降(设为99999999,后续跳过)
降低后用 cal_change_price() 计算对应新单价,取 max(新单价, 控销底价)
③ 起拼价<250元 → 尝试提升起拼量、降低单价
当 start_amount × target_price < 250 时,尝试提升起拼量来降低单价:
提升规则(按优先级匹配):
· 组数%3==0:min_amount_up = 组数 × 5/3 × mid_amount
· 组数%4==0:min_amount_up = 组数 × 7/4 × mid_amount
· 起拼量%10==0:ceil(量/10)/3 × 5 × 10
· 起拼量%5==0:ceil(量/5)/3 × 5 × 5
· 起拼量%3==0:× 5/3
· 起拼量%4==0:× 7/4
· 都不匹配:× 2(翻倍)
提升后同样计算新单价,若新单价 = 目标价则放弃(无实际意义)
▼ 运行流程
获取商业基础信息
物流价格、毛利率、起重
⬇
获取托管品种数据
底价、库存、效期、重量
⬇
获取市场低价数据
前3低价活动
⬇
计算每个品种定价
考虑库存/销量/市场价/重货/箱规
⬇
设计阶梯价
起拼/低起拼/高起拼/大货
⬇
输出定价结果
总览统计+异常识别
⬇
获取在架活动信息
一口价/批购
⬇
分类处理
需调价/价差大/库存不足/无变化
⬇
自动提报
筛选准入价→上传Excel→调用接口
⬇
自动改价
改价→改起拼→改阶梯价
⬇
标记托管活动
所有触碰过的活动