十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

洗衣店小程序源码解析:订单状态机与三级分销设计

洗衣店小程序源码解析:订单状态机与三级分销设计 简介洗衣店小程序源码-带分销商业版完整版本号2.4.8是一套面向洗衣门店经营者与小程序开发者的可直接商用的完整源码用于搭建一个集在线下单、订单管理、直播推广、分销裂变于一体的洗衣服务平台。压缩包共700个文件约7.17MB核心包括png/gif图片素材、json配置、js逻辑、wxml/wxss页面结构、php后台接口及html管理端页面等并含第三方前端样式库与海报动图素材目录结构完整便于部署和二次开发。版本2.4.8着重修复了管理端接单问题同时加入直播开关与分销体系能帮助店主提升接单效率、拓展营销渠道。资源包内还包含用户中心、支付接口、服务评价、优惠活动、客户咨询等完整功能模块适合需要快速上线或升级线上洗衣业务的团队。已有233人学习下载可作为功能参考与代码底稿。1. 洗衣店小程序源码的订单链路与分销设计一家连锁洗衣店把线下门店搬到微信小程序上最先遇到的不是没有订单而是订单一来、人手一乱后台接单就打架。两个客服同时点“接单”同一笔订单被分配给两个人干洗房拿着两种标签。这个问题在商业版2.4.8中反复调过核心就是把“接单”这个动作从裸更新变成带状态校验的事务操作。整套源码包含sweetalert2.css、bootstrap-select.min.css、style.css等后台界面资源也覆盖订单流转、分销关系、直播开关、营销活动这些完整链路。适合正在落地洗衣服务线上化的运营者、接二手项目的开发者以及想拆一套微信小程序商业版源码来做参考的PHP程序员。源码要理解到位得先把订单状态机看清楚。2. 订单状态机与管理端接单修复实现洗衣店小程序跟普通电商小程序最大的差异在于订单不是即时履约的它要经过“用户下单→商家确认→衣物洗涤→配送/自取→完成”这样一条线下链条。每一步都必须反映在订单状态字段上否则用户端看不到进度管理端也不知道该处理哪一批。2.1 订单状态流转模型在该源码中订单状态用一个整型字段order_status表示取值约定如下状态值含义用户端展示0待支付等待支付1待接单商家确认中2已接单洗涤中3配送中配送/自取中4已完成已完成5已取消已取消6售后中售后处理中状态只允许向特定方向迁移例如只有order_status 1的订单可以被置为2只有2才能进3。这个约束看着简单实际很多商业版源码在初次上线时是缺失的所以才出现管理员连续点两下“接单”把订单状态从1推到2再覆盖为2的重复操作。2.2 并发接单的修复方案版本2.4.8 修复管理端接单问题做法是在更新语句里带上状态条件并用受影响行数判断是否被抢先处理。这是比较经典的乐观锁思路代码集中在OrderController的acceptOrder方法中。$pdo-beginTransaction(); $sql UPDATE orders SET order_status 2, accept_admin_id :admin_id, accept_time NOW() WHERE order_id :order_id AND order_status 1; $stmt $pdo-prepare($sql); $stmt-execute([ :admin_id $adminId, :order_id $orderId ]); if ($stmt-rowCount() 0) { $pdo-rollBack(); return [code 4001, msg 订单已被其他管理员处理]; } // 记录接单日志、推送模板消息给用户 $pdo-commit();这个片段中关键点有两个一是WHERE order_status 1它保证了只有待接单的订单才能被接单二是rowCount()的返回值当等于 0 时说明订单状态已经变了此时回滚事务并提示前端。这里还使用了数据库事务保证订单更新和操作日志写入要么同时成功、要么同时失败。需要注意rowCount()在不同持久层框架下表现有差异如果你把源码迁移到 ThinkPHP 或 Laravel建议用affectedRows或rowCount做兼容否则可能读到 0 误判订单状态。2.3 用户端状态展示与消息模板用户小程序端拿到订单列表后根据状态值渲染不同的按钮和提示。前端代码在pages/order/detail.js中核心逻辑如下const statusText { 0: 待支付, 1: 等待商家接单, 2: 衣物洗涤中, 3: 正在配送, 4: 已完成, 5: 已取消, 6: 售后处理中 } // 状态为1时展示“催单”按钮 wx.request({ url: ${baseUrl}/order/detail, data: { orderId: this.data.orderId }, success: (res) { this.setData({ statusText: statusText[res.data.order_status], showRemind: res.data.order_status 1 }) } })这段代码渲染的是状态文本与交互按钮。showRemind只对order_status 1的订单生效让用户催单时直接调用管理端的提醒接口避免每单都打店里电话。通过这样一套状态展示逻辑用户感知到的服务进度是连续的减少“不知道衣服洗到哪了”的焦虑。3. 分销体系的分佣计算与用户关系绑定带分销的洗衣店小程序商业价值不在洗衣本身而在用户裂变。每次用户支付洗衣费后系统按设定比例把一部分金额分给推广者。这套逻辑的复杂度集中在两个地方用户关系如何绑定不丢、分佣如何计算不超发。3.1 三级分销模型与比例配置源码中分销等级默认三级一级推广者、二级推广者、三级推广者。每个用户最多从下两级获得分成。常见参数配置如下参数名默认值说明level1_rate0.10一级分佣比例 10%level2_rate0.05二级分佣比例 5%level3_rate0.03三级分佣比例 3%min_withdraw10.00最低提现金额 10 元auto_settle1订单完成后是否自动结算这里三级分销不是三级跳而是“用户A推荐BB推荐CC消费后A和B都能拿到佣金”。源码中采用固定比例未引入级差制方便管理端快速配置。3.2 分销关系表与上游绑定用户关系表设计为单独一张表避免在users表里反复修改parent_id造成更新冲突。CREATE TABLE user_distribution ( id int(11) NOT NULL AUTO_INCREMENT, user_id int(11) NOT NULL COMMENT 用户ID, parent_id int(11) DEFAULT NULL COMMENT 上级用户ID, level tinyint(4) DEFAULT 1 COMMENT 当前用户在链路上的层级, bind_time datetime DEFAULT NULL COMMENT 绑定时间, bind_source varchar(32) DEFAULT share COMMENT 绑定来源share或scan, PRIMARY KEY (id), KEY idx_user_parent (user_id, parent_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;用户扫码进入小程序时通过scene参数带上分享者的user_id首次登录注册后写入这条关系记录。bind_source字段用来区分用户是通过分享海报还是扫描门店码进入的两种来源对后续分销统计很重要。3.3 订单分佣计算实现分佣计算发生在订单状态变为4已完成之后系统拿出一部分利润按比例分配。$order getOrder($orderId); if ($order[order_status] ! 4) { return; // 未完成订单不计佣金 } $parentMap getParentMap($order[user_id]); // 向上取两级 $rates [ 1 0.10, 2 0.05, 3 0.03 ]; foreach ($parentMap as $level $parentUserId) { $amount round($order[pay_amount] * $rates[$level], 2); if ($amount 0) continue; addCommissionRecord([ user_id $parentUserId, order_id $orderId, level $level, amount $amount, status 0 // 0待结算1已结算 ]); }getParentMap会递归查询user_distribution表最多返回两级上级。分佣金额基于pay_amount而不是商品原价这样就规避了优惠券、满减活动带来的佣金虚高问题。status字段控制结算状态在用户确认收货 7 天后自动置为 1 并进入可提现金额。实际部署时要注意分销关系绑定必须延迟到支付回调之后防止刷单用户反复取消订单再生成多条绑定记录。4. 直播开关与营销模块的配置化洗衣是一个重信任的服务品类用户在下单前会顾虑“衣服是不是真的干洗”“洗坏了怎么办”。直播就是为了解决信任问题而设计的模块。该源码在 2.4.8 中加入了直播开关后台开启后用户端才会显示直播入口。4.1 直播入口配置与前后端联动配置存放在config表键名is_live_enabled0 表示关闭1 表示开启。为了不修改代码就能控制前端入口页面加载时先拉取配置// pages/index/index.js 页面加载时拉取全局配置 wx.request({ url: ${baseUrl}/config/index, success: (res) { const cfg res.data if (cfg.is_live_enabled 1) { wx.setStorageSync(liveUrl, cfg.live_url) this.setData({ showLiveEntry: true }) } } })后端返回的live_url是直播间的跳转地址可以是微信视频号直播链接也可以是小程序内置的小程序直播组件路径。若后台未开启开关前端不渲染直播入口避免用户点击后空转。4.2 营销模块组合逻辑洗衣服务本身是低频消费需要使用满减、优惠券、次卡等手段拉高复购率。源码中的营销模块以coupon和promotion_rule两张表为核心。表名关键字段用途promotion_rulerule_type, threshold, discount满减规则配置couponcoupon_type, amount, expire_time优惠券发放与核销user_couponuser_id, coupon_id, status用户持有的优惠券结算时计算顺序为先核销用户优惠券再匹配满减规则最后应用分销分佣。这个顺序决定了商品实付金额是优惠后的值分佣比例不变但基数变小保障了商家利润率。4.3 回调幂等与订单号生成支付回调处理上洗衣店小程序需要比普通商城更严格。每次回调都要校验订单状态防止重复通知导致重复改单。$order getOrderByTradeNo($tradeNo); if ($order[pay_status] 1) { // 已支付直接返回成功不再重复处理 return [code 0, msg success]; } $pdo-beginTransaction(); updateOrderPayStatus($order[order_id]); addPayLog($order[order_id], $tradeNo); $pdo-commit();订单号采用paid_{userId}_{timestamp}的拼接方式后端用userId快速定位用户用timestamp保证唯一性。这种生成方式虽然不具随机性但在分布式部署下冲突概率极低且日志排查时一眼能看出是谁的订单。5. 部署验证与二次开发的四个技巧源码到手之后不要急着改页面先把这套流程跑通再在业务边界上做扩展。5.1 上线前环境清单项要求备注PHP 版本7.0 及以上源码未使用强类型语法兼容 7.x/8.xMySQL5.7 及以上使用 InnoDB 引擎避免 MyISAM 行锁问题域名已备案微信小程序 request 合法域名必须是 HTTPS小程序 AppID已注册分销、直播、支付均依赖 AppID 配置上线前用两个微信号分别测试“用户下单→管理端接单→管理员改状态→用户确认完成→一级分销佣金入账”这条完整链路。5.2 高频故障排查命令管理端接单异常、订单状态卡在1时通常先看 SQL 日志或直接用 MySQL 查状态mysql -uroot -p xiyi_order -e \ SELECT order_id, order_status, pay_status, accept_time FROM orders WHERE created_at NOW() - INTERVAL 1 DAY;如果发现大量订单停留在0和1优先检查微信支付回调地址是否在mp.weixin.qq.com后台配置正确回调地址必须指向notify.php而不是首页入口。5.3 实用扩展动态设置页面标题版本 2.4.8 源码中页面标题是写死在app.json里的一次审核只能一个标题。想按门店、按活动动态变化可以在onShow生命周期中修改wx.setNavigationBarTitle({ title: XX洗衣·冬季羽绒服专洗 })这样用户从分销海报进入时可以看到带门店标识的标题。但注意这个设置不会同步到app.json适用于需要按场景切换标题的营销页不适合用来替代小程序基础配置。5.4 定时任务与订单超时自动取消未支付订单不要一直占着库存和后台列表建议加一个 crontab 任务每 10 分钟执行一次取消逻辑*/10 * * * * php /var/www/html/order/autoCancel.php /tmp/auto_cancel.log 21autoCancel.php内部执行UPDATE orders SET order_status 5 WHERE order_status 0 AND created_at NOW() - INTERVAL 30 MINUTE并在取消后释放已锁定的洗衣档期。这一条不依赖微信回调属于纯服务端保底逻辑加上之后订单积压问题会明显减少。本文还有配套的精品资源点击获取
返回列表