当前位置: 首页 > news >正文

CRMEB Pro 商品上下架二开避坑:一个开关为什么会牵动审核、购物车和活动商品?

摘要

商品上下架看起来只是一个is_show开关,但在商城系统里,它会影响购物车是否可购买、移动端是否展示、商品推荐位是否出现、活动商品是否还能继续卖、批量操作是否需要走队列,甚至会和商品审核、强制下架、自动上架时间产生联动。

CRMEB Pro 当前商品模块里,单商品上下架、批量上下架、商品审核、批量审核和活动检测都有独立入口。二开时如果只改商品表的is_show,很容易出现后台已下架但购物车还能买、审核拒绝后移动端还显示、批量全选操作超时等问题。

这篇从源码入口出发,整理商品状态二开的关键边界。

一、上下架不是只改商品主表

后台路由在crmeb_pro/route/admin.php

PUT product/product/set_show/:id/:is_show 单商品上下架 PUT product/product/product_show 批量上架 PUT product/product/product_unshow 批量下架 POST product/product/set_verify/:id 商品审核 POST product/product/batch_verify 商品批量审核 GET product/product/check_activity/:id 检测商品是否有活动开启

前端接口在crmeb_pro_admin/src/api/product.js

PostgoodsIsShow 单商品上下架 productShowApi 批量上架 productUnshowApi 批量下架 productReviewApi 商品审核 productBatchVerifyApi 批量审核 checkActivityApi 检测活动

真正的状态处理在:

crmeb_pro/app/services/product/product/StoreProductServices.php setShow() verify() batchVerify() checkActivity()

也就是说,状态二开要看 Controller、Services、购物车、活动和缓存,而不是只看字段。

二、单商品上下架会同步购物车状态

后台单商品上下架入口是:

StoreProduct::set_show()

它会先做供应商商品权限校验,再调用:

StoreProductServices::setShow([$id], $is_show)

服务层里会处理几件事:

1. 上架时检查回收站商品不能直接上架 2. 批量更新购物车商品 status 3. 更新商品 is_show 4. 手动上架时清空 auto_off_time 5. 同步商品关联关系展示状态 6. 触发 product.status 事件 7. 清理商品缓存

这说明商品是否可买,不是只看商品表。购物车里也有状态字段,如果商品下架后不更新购物车,用户可能还能从购物车继续下单。

二开建议:

商品下架必须同步购物车不可用 商品恢复上架要确认是否允许恢复购物车 回收站商品不能绕过恢复流程直接上架 状态变化后要清缓存并触发事件

三、批量上下架分单页和全选两种处理

product_show()product_unshow()都会接收:

ids 当前选中的商品 ID all 是否全选 where 当前筛选条件

如果all == 0,说明只处理当前勾选商品,Controller 会直接调用setShow()

如果all == 1,说明用户点的是“所有页全选”,这时不会把所有 ID 一次性塞进请求,而是把筛选条件交给队列:

QueueServices::setQueueData() BatchHandleJob::dispatch()

这点很适合大商品量场景。二开时如果新增批量状态,不要直接把所有商品 ID 查出来在一次请求里循环更新。更稳的做法是:

当前页少量商品:同步处理 所有页或大批量商品:进入队列 队列按筛选条件分批取 ID 操作完成后清缓存和记录日志

这样后台不会因为一次批量操作卡死。

四、审核和上下架是两套状态,不能混成一个字段

商品审核入口是:

StoreProduct::setVerify() StoreProduct::batchVerify()

服务层方法是:

StoreProductServices::verify() StoreProductServices::batchVerify()

当前审核逻辑会处理:

is_verify 审核状态 refusal 拒绝原因 is_show 是否展示 auto_on_time 自动上架时间

如果设置了自动上架时间,服务层会把商品先设为未上架:

auto_on_time 有值时,is_show = 0

审核时还会把购物车里该商品的可用状态更新为不可用。这个处理很重要,因为审核失败、强制下架、等待自动上架,都不应该继续允许用户从购物车购买。

二开时要分清:

is_show 控制商品是否展示/销售 is_verify 控制商品是否审核通过 is_del 控制是否进入回收站 auto_on_time / auto_off_time 控制定时上下架

不要用一个字段同时表示“审核失败”和“下架”,否则后续列表筛选、头部统计、运营处理都会乱。

五、活动商品下架要先检查活动关联

后台提供了检测活动的入口:

product/product/check_activity/:id

服务层checkActivity()会检查商品是否存在进行中的:

秒杀 砍价 拼团

如果仍有活动开启,会抛出“商品有活动开启,无法进行此操作”。

虽然当前setShow()中下架检测有注释保留,但这个能力仍然很关键。二开时如果要强制下架、批量下架、删除商品或修改 SKU,建议先确认活动关联。否则可能出现:

普通商品下架了,活动页还在卖 活动库存和普通库存不一致 用户从活动入口下单失败 售后退回库存找不到原商品状态

更稳的做法是把“是否允许下架”做成统一服务方法,批量下架、强制下架、删除商品都调用同一套检查。

六、供应商、门店、平台商品要做归属限制

商品状态接口里多处会调用类似权限校验:

checkSupplierProductAuth()

批量处理时,如果是供应商登录,还会把筛选条件改成:

type = 2 relation_id = 当前供应商 ID

商品批量操作服务里也会区分平台、门店、供应商归属:

type = 0 平台 type = 1 门店 type = 2 供应商

二开状态时不要只按商品 ID 更新。尤其是供应商后台、门店后台、平台后台共用商品表时,一定要先限定归属范围,再执行批量操作。

七、推荐的商品状态二开流程

1. 明确新增状态属于展示、审核、删除、定时还是活动控制 2. 后台按钮只提交状态意图,不直接写库 3. Controller 只做参数和权限校验 4. Services 统一处理购物车、活动、关联商品、事件和缓存 5. 单页操作同步处理,全选操作走队列 6. 移动端列表和详情接口同步过滤 is_show、is_verify、is_del 7. 记录操作日志或审核原因,便于运营追溯

商品状态越多,越需要控制入口。不要每个页面都写一份“上下架逻辑”。

八、关键代码/目录说明

crmeb_pro/route/admin.php 后台商品上下架、审核、批量审核、活动检测路由。 crmeb_pro_admin/src/api/product.js 后台前端商品状态相关接口封装。 crmeb_pro/app/controller/admin/v1/product/StoreProduct.php 商品后台 Controller,包含 set_show、product_show、product_unshow、batchVerify、check_activity。 crmeb_pro/app/services/product/product/StoreProductServices.php 商品服务,setShow 负责上下架联动,verify 和 batchVerify 负责审核联动。 crmeb_pro/app/services/product/product/StoreProductBatchProcessServices.php 商品批量操作服务,负责按筛选条件批量处理商品。 crmeb_pro/app/jobs/BatchHandleJob.php 批量上下架等任务的队列入口。

九、注意事项

  • 不要直接更新is_show后就结束。
  • 下架、审核拒绝、强制下架要考虑购物车状态。
  • 回收站商品不能直接上架,应先恢复。
  • 全选批量操作要走队列,不要一次请求循环所有商品。
  • 活动中的商品下架、删规格、删除商品前要检查秒杀、砍价、拼团。
  • 供应商和门店端必须限制商品归属,避免跨主体操作。
  • 状态变化后要清理商品缓存,并考虑触发事件给搜索、推荐或统计模块。

标签建议

CRMEB CRMEB Pro 商品上下架 商品审核 二次开发 队列 商城系统
http://www.jsqmd.com/news/1002530/

相关文章:

  • CodeWhale 0.8.43 官方版下载(夸克网盘+百度网盘,SHA256校验)
  • 用AT89C51和LCD1602做个计算器?手把手教你从Proteus仿真到代码烧录(附完整源码)
  • 超详细!CC-Switch 3.16.1 全平台部署 使用指南【2026.6.12】
  • Proteus实战:5分钟搞定DAC0832数模转换电路搭建与电压测量
  • 革命性游戏自动化:三月七小助手如何用智能图像识别技术彻底改变星穹铁道体验
  • 抖音直播数据抓取神器:3分钟快速掌握实时弹幕监控技巧
  • 2026年C语言寒冬?软件编程专业毕业即失业吗?
  • 2026离心盘厂家实力之选:湘潭塑胶件离心盘/长沙高速排序离心盘/自动送料分选离心盘/不锈钢耐磨震动盘配套优选 - 品牌发掘
  • 从专家打分到科学决策:手把手教你用AHP层次分析法为项目风险/产品功能排优先级
  • 终极B站视频下载方案:一键解锁4K高清会员内容
  • 企业级SSD好在哪?是否耐用——常见问题全解答
  • 除了写博客,你的Jekyll+Gitee还能这么玩:打造个人简历、项目文档和在线PPT
  • 静态IP vs 动态IP代理:区别解析与多场景选型指南
  • pytest+requests+allure自动化测试接入Jenkins学习
  • python-social-auth:Python 社交认证的老牌方案
  • 2026年 震动盘厂家实力解析:湘潭五金/长沙塑胶小件/精密小型/不锈钢防尘/自动化送料/螺丝排序/变频调速震动盘源头供应品牌深度评估报告 - 品牌发掘
  • Windows下用C++写的带图形界面的WinPcap抓包分析工具源码
  • 如何用Python抢票神器10分钟搞定演唱会门票:大麦助手damaihelper终极指南
  • 保姆级教程:在ROS Noetic的Gazebo仿真中,为URDF机器人模型添加深度摄像头(Kinect)
  • 别再手动算了!教你用Python循环和条件判断,模拟‘打工人’攒钱买房全过程
  • 保姆级教程:用Python处理GDAS1气象数据,手把手教你转成NetCDF格式(附避坑指南)
  • 保姆级教程:手把手教你用LIO_SAM复现KITTI 08序列(附完整数据准备与EVO评估流程)
  • 用LM358和红外管DIY一个无线耳机:从电路图到调试,手把手教你避开自激和信号弱的坑
  • 2026年上海起诉离婚律师怎么选?财产分割、抚养权与继承实务深度调研 - 优质品牌商家
  • 3步轻松上手:用Alas实现碧蓝航线全自动游戏管理终极指南
  • 别再硬编码控件位置了!用WinForms的TableLayoutPanel+FlowLayoutPanel搞定自适应布局(附完整项目源码)
  • 2026年,临沂兰陵眼镜店维修保养秘籍
  • 企业级SSD与消费级SSD的本质区别:看似相同的硬盘,为何价格相差数倍?
  • 别再手动数圆了!用OpenCV+Python三行代码自动识别图片中的圆形并标记中心点
  • 2026酒店隔墙施工选材指南:轻质隔墙品牌与方案横向评估 - 优质品牌商家