WMS 仓库管理主题(wms-2592)项目交接详细说明
一、项目概述
· 主题名称:wms-2592(基于 WordPress 自研仓库管理系统主题)
· 当前状态:已上线使用,功能相对完善,持续优化中
· 核心目标:实现产品管理、出入库记录、库存实时计算、预警、批量导入导出、二维码打印、用户权限、删除审批、库存盘点等功能。
二、文件结构
```
wms-2592/
├── style.css # 前端全部样式(白灰主题、响应式表格、打印样式)
├── functions.php # 核心功能:注册CPT/分类、库存事务、日志、性能缓存、加载inc模块
├── header.php # 导航栏(含用户登录状态)
├── footer.php # 页脚
├── inc/ # 模块目录
│ ├── export-templates.php # 导出模板及字段定义
│ ├── export-csv.php # CSV导出处理(支持日期筛选)
│ ├── settings.php # 仓库设置(登录Logo、访问控制、开放查看记录)
│ ├── user-permissions.php # 用户权限管理(出入库/查看记录/审批权限)
│ ├── import-products.php # 产品导入(含逐字段覆盖预览确认)
│ ├── table-settings.php # 前端表格列自定义(全局+用户个人)
│ ├── delete-requests.php # 删除申请审批(含库存恢复)
│ ├── user-center.php # 用户中心相关钩子(模板加载、保存列设置等)
│ ├── scan-stock.php # 扫码出入库页面注册
│ ├── qr-print-export.php # 二维码批量打印/导出(支持批量名称筛选)
│ ├── admin-product-list.php # 后台产品列表增强(列、筛选、排序)
│ └── inventory-check.php # 库存盘点(导入易飞CSV对比)
└── page-templates/ # 页面模板
├── products.php # 产品列表(搜索、筛选、排序、分页、CSV导出)
├── inbound-records.php # 入库记录(同产品列表功能)
├── outbound-records.php # 出库记录(同产品列表功能)
├── stock-alerts.php # 库存预警(使用缓存低库存ID)
├── warehouse-home.php # 今日汇总(统计卡片+最近记录)
├── product-detail.php # 产品详情(出入库操作、图片上传、二维码打印)
├── user-center.php # 用户中心(个人操作记录、删除申请、自定义列)
└── scan-stock.php # 扫码出入库(产品二维码列表)
```
三、自定义文章类型(CPT)与分类法
CPT
· wh_product:产品(支持标题、编辑器、缩略图,库存等 meta)
· wh_inbound:入库记录(禁止前端手动创建)
· wh_outbound:出库记录(禁止前端手动创建)
· wh_log:操作日志(无菜单,专用页面查看)
· wh_delete_request:删除申请(无菜单,审批用)
分类法
· product_cat:产品分类(层级)
· storage_location:存放位置(标签,用于产品)
· inbound_location:入库位置(标签,用于入库记录)
· outbound_location:出库位置(标签,用于出库记录)
四、关键 Meta 字段
产品 (wh_product)
· _wms_stock:当前库存(整数,默认0)
· _wms_low_stock_threshold:预警阈值(默认5)
· _wms_spec:产品规格(文本)
· _wms_product_code:产品编码(用于盘点匹配)
· _wms_signature:签名图片URL(可选)
· _wms_doc_image:单据图片URL(可选)
· _wms_location2:库位(备用字段)
出入库记录 (wh_inbound/wh_outbound)
· _wms_product_id:关联产品ID
· _wms_quantity:数量(正数)
· _wms_operator:操作人用户名
· _wms_date:操作时间戳
· _wms_balance:操作后结存
· _wms_note:备注
· _wms_customer_note:客户备注(仅入库)
· _wms_customer_note_image:客户备注图片(仅入库)
· _wms_signature / _wms_doc_image:图片
· _wms_location2:库位
操作日志 (wh_log)
· _wms_log_user_id、_wms_log_username
· _wms_log_action、_wms_log_description
· _wms_log_time
· _wms_log_product_id、_wms_log_quantity、_wms_log_balance
· _wms_log_record_id:关联的出入库记录ID(用于删除申请)
五、核心函数索引(重要)
functions.php
· wms_register_post_types() / wms_register_taxonomies()
· wms_get_product_stock() / wms_update_product_stock()
· wms_get_low_stock_threshold()
· wms_add_log():写日志
· wms_handle_stock_forms():处理出入库表单(使用事务和行锁)
· wms_recalculate_product_balances($product_id):重算产品所有记录的结存(删除记录后调用)
· wms_get_low_stock_product_ids():性能优化,使用SQL直接查询低库存产品ID,带缓存
· wms_ensure_stock_meta_exists():确保产品库存meta存在
inc/export-csv.php
· wms_export_csv():导出CSV,支持 inbound、outbound、products 类型,已修复日期筛选
inc/import-products.php
· 导入产品:支持字段级覆盖,预览后勾选确认,已修复缓存问题
inc/delete-requests.php
· wms_process_delete_request():审批删除,已修复库存恢复和结存更新
inc/admin-product-list.php
· 后台产品列表添加列:库存、分类、规格、编码、日期,库存状态筛选
inc/inventory-check.php
· 库存盘点:上传易飞CSV,对比系统库存,勾选调整
六、重要设计要点
1. 并发安全
· 在 wms_handle_stock_forms() 中,使用 START TRANSACTION + SELECT ... FOR UPDATE 锁定产品库存行,防止超卖。
· 所有库存更新前检查 _wms_stock 行是否存在,确保新产品初始化。
2. 删除记录后的数据一致性
· 永久删除(before_delete_post)或审批删除(wms_process_delete_request)后,调用 wms_recalculate_product_balances($product_id) 重新计算所有记录的结存,并更新产品当前库存。
· 该函数按时间顺序累加/扣减,确保结存正确。
3. 二维码保持不变
· 绝对不能修改 wms_get_qr_image_url() 函数中的 $qr_data 生成逻辑。
· 二维码内容 = product-detail 页面链接 + ?product_id=产品ID
· 已打印的二维码继续有效。
4. 性能优化
· wms_get_low_stock_product_ids() 使用SQL直接比较两个meta字段,避免循环所有产品。
· 产品库存和阈值有对象缓存(wp_cache)。
· 导入时使用 wp_suspend_cache_invalidation(true) + 定期 wp_cache_flush(),提高大批量导入速度。
5. CSV导出
· 导出链接携带当前表格列(fields 参数),CSV列与页面显示一致。
· 支持日期范围、分类、排序等筛选条件。
6. 用户权限
· 后台仅管理员可访问(wms_restrict_admin_access)。
· 前端用户权限通过 user_meta 控制:wms_permissions(数组,可能包含 inbound/outbound)、wms_approve_permission、wms_view_inbound_permission、wms_view_outbound_permission。
七、已实现但可能需优化的点
1. 分类筛选性能:在出入库记录页面,按产品分类筛选时先用 get_posts 获取该分类下所有产品ID,再用于 meta_query,产品数量大时可能较慢。可考虑使用SQL JOIN。
2. 二维码导出PDF:仍是HTML预览方式,用户通过浏览器打印另存为PDF。没有真正的PDF生成库。
3. 用户中心“删除记录”标签:用户只能申请删除,无法直接查看自己已删除的记录(回收站中的记录)。未实现。
4. 后台产品列表库存筛选:已使用 posts_where 钩子实现低库存/正常/零库存筛选,可测试是否正常。
5. 移动端导航:导航栏在小屏幕可能拥挤,可添加汉堡菜单。
6. 数据备份:无自动备份机制,建议定期手动备份数据库和文件。
八、下一步工作建议(按优先级)
1. 继续修复用户反馈的具体问题(如导出、分页、筛选等)。
2. 实现用户中心“删除的记录”标签,展示已删除记录(含审批信息)。
3. 优化分类筛选性能(使用自定义SQL或缓存产品分类关系)。
4. 集成真正的PDF生成库(如 Dompdf / TCPDF)用于二维码PDF导出。
5. 增加报表统计图表(如每日出入库趋势)。
6. 完善移动端体验。
九、对接注意事项
· 请务必保留二维码生成逻辑不变。
· 修改任何文件后,建议测试导入、导出、出入库、删除审批、盘点等关键流程。
· 注意缓存清理:更新产品库存后需清除 product_stock_ 和 wms_low_stock_ids 缓存。
· 所有后台新增子菜单均挂在 edit.php?post_type=wh_product 下。
十、当前未完成但用户曾提及的需求
· 用户中心增加“删除的记录”标签,可查看自己删除的记录及审批状态。
· 库存盘点功能已添加,但用户可能未看到菜单(需确认 functions.php 已加载 inc/inventory-check.php)。
· 后台产品列表已增强,但筛选功能可能需进一步调整。
---
以上是完整的项目交接文档,新窗口对话时,请直接粘贴此文档,并告知要处理的具体问题,我将立即继续协助。
文章末尾固定信息









11F
* 记住:二维码永久不变。
* 记住:几万产品也要流畅。
* 记住:一定要使用者可以自定义,选择用或不用,硬塞给使用者,非常影响体验感(功能必须做出来,用不用由使用者决定,硬塞给使用者,太多了,使用者会反感,最后不使用,我们的努力就白费了,)
* 记住:一个功能多种用法,让使用者选择适合自己的。Excel,就是可以灵活自定义,自定义面对多种场景,现在很多数据库用的就是Excel表格,成为办公神器。手机,使用者可以选择自己想要的功能,那些功能要,哪些功能不要,现在成为每人必备。引用他们思路一起打造erp仓库的神器
10F
wp-content/themes/wms-theme/
├── functions.php
│
├── admin-pages/ ← 后台功能(比如 my-apps-page.php、backend-access.php)
├── front-pages/ ← 前端功能
├── display-modes/ ← 显示模式
│ ├── core.php
│ ├── switcher.php
│ └── ajax.php
│
├── inc/
│ ├── modules/ ← 现有模块(不动)
│ ├── admin/ ← 兼容老结构(如果之前建过)
│ ├── front/ ← 兼容老结构
│ └── …
│
├── page-templates/
└── …
9F
* 记住:二维码永久不变。
* 记住:几万产品也要流畅。
* 记住:
* 记住:一个功能多种用法,让使用者选择适合自己的。Excel,就是可以灵活自定义,自定义面对多种场景,现在很多数据库用的就是Excel表格,成为办公神器。手机,使用者可以选择自己想要的功能,那些功能要,哪些功能不要,现在成为每人必备。引用他们思路一起打造erp仓库的神器
8F
* 记住:二维码永久不变。
* 记住:几万产品也要流畅。
* 记住:一个功能多种用法,让使用者选择适合自己的。Excel,就是可以灵活自定义,自定义面对多种场景,现在很多数据库用的就是Excel表格,成为办公神器。手机,使用者可以选择自己想要的功能,那些功能要,哪些功能不要,现在成为每人必备。
* ============================================================================ */
7F
卡片模式装不下,可以换行,前提是所有的卡片大小统一,总宽度不能大于屏幕
我的工作台这区域大小以屏幕为主,总宽度不能大于屏幕,
表格模式下,装不下,可以左右滑动查看,总宽度不能大于屏幕
6F
但是还是没有理解透,我表达的意思
比如每个人都是使用者,
这里,我把仓库这框架比作手机,
每个人,每个年龄段,对手机需求不一样
大人给手机给小孩,希望跟打电话小孩聊天,
小孩会用手机了,对手机的需求,不一定是用手机聊天,那0-10岁之前的小孩使用手机多半是,玩游戏,玩累了,就是看自己想看的电视视频,
10-15岁以后的小孩,对手机的需求可能是聊天,跟朋友一起聊天玩游戏,而大人希望,10的小孩用手机学习,
15-20的人可能对手机需求,联系沟通一起玩,一起玩游戏,用手机导航出行,购物,看各个平台视频,
20岁以上的人,到了奋斗年龄,通过手机联系曾经的同事找工作,或在网上找工作,或通过手机去旅游,或可能想通过手机赚钱,或在手机上制作视频,或在手机上听音乐看电视,视频,或在网上关注火爆的新闻,或寻找赚钱的方法等等,还有很多需求……
曾经的手机只能打电话,没有什么功能,现在的手机,丰富多彩,各种功能
新买的手机,没有多少功能,可是使用者,可以在手机上,把自己需要的,装进手机里,
让使用者对手机,爱的离不开手机,这就是手机。
像这款WordPress搭建的仓库管理主题,
是针对公司的,有些功能,可能不经常使用,但功能必须有,
5F
你是经验丰富的专家,用你丰富的经验,带着我们的信仰,深度仔细思考使用者每个细节,怎么解决,让使用者更灵活使用,根据自己的想法使用,让代码拥有丰富多彩的灵魂,请根据我的需求写出拥有灵魂的完整代码,
4F
重点交接:重中之中
·二维码不能变,已打印,正在使用。
·当产品达到几万个时,要保持非常流畅。
·我们要用丰富的经验多思考,使用者使用场景,每个场景使用的细节,多给使用者选择,比如每一个使用者都扮演者不同发的角色,多使用丰富的经验思考这些细节,很多时候,同一件事,每一个角色有好几种处理方式,每一个角色处理方法不一样。
有时候这样处理,有时候那样处理。
写出来的功能代码要灵活多用,好让代码拥有灵魂,这不仅仅是我们的使命,更是我们的信仰
·每次修改增加功能,尽量给出完整代码,
每个php文件,尽量不要超过1200行,
如果代码会超过1200行,尽量创建新PHP文件
3F
重点交接:重中之中
·二维码不能变,已打印,正在使用。
·当产品达到几万个时,要保持非常流畅。
·我们要用丰富的经验多思考,使用者使用场景,每个场景使用的细节,多给使用者选择,比如每一个使用者都扮演者不同发的角色,多使用丰富的经验思考这些细节,很多时候,同一件事,每一个角色有好几种处理方式,每一个角色处理方法不一样。
有时候这样处理,有时候那样处理。
写出来的功能代码要灵活多用,好让代码拥有灵魂,这不仅仅是我们的使命,更是我们的信仰
·每次修改增加功能,尽量给出完整代码,
每个php文件,尽量不要超过1200行,
如果代码会超过1200行,尽量创建新PHP文件
(我们要多考虑,使用者使用时会面对多种使用场景,多给使用者选择,很多时候,同一件事,有好多种处理方式,
有时候这样处理,有时候那样处理,要让使用者多选择,灵活使用)这是宗旨
这是信仰,
不然做出来,使用者,都不使用,那相当于没有用,跟没做有什么区别,
记住这是我们的信仰
2F
(我们要多考虑,使用者使用时会面对多种使用场景,多给使用者选择,很多时候,同一件事,有好多种处理方式,
有时候这样处理,有时候那样处理,要让使用者多选择,灵活使用)这是宗旨
这是信仰,
不然做出来,使用者,都不使用,那相当于没有用,跟没做有什么区别,
记住这是我们的信仰
1F
我们要多考虑,使用者使用场景,多给使用者选择,很多时候,同一件事,有好几种处理方式,
有时候这样处理,有时候那样处理