Tigshop开源商城 分销中心:源码只留了 salesman 表,C 端接口我给补全(附代码

简介: tigshop开源版虽预留分销数据模型(Salesman等),但C端接口缺失。本文基于现有model快速补全一级返佣与“我的分销中心”功能:新增Service聚合数据、Controller提供API、路由注册及支付回调自动记佣,前端Uniapp对接展示,零建表、轻量落地。(239字)

在 tigshop 单商户版里翻分销功能,会看到一个挺微妙的状态。php/app/model/salesman/SalesmanSalesmanOrderSalesmanCustomerSalesmanProduct 这些模型都在,表结构也齐;但 php/app/api/controller/ 里没有 salesman 目录,php/app/service/admin/ 下也没有 salesman 这一层。

也就是说,分销中心是 Pro 功能,开源版只给你留了数据层,C 端一个接口没有。官网功能清单里"多级分销、分销中心、推广海报"后面确实都标着 (Pro)。

这次客户只要个最简单的一级返佣加"我的分销中心",没必要为这个上 Pro。我照着 model 已有的字段,把 C 端接口补了出来。

先认字段

建表的功夫省了,salesman_order 表该有的都定义好了。翻一下实际列名,别想当然:

-- salesman_order 实际字段(数据库里已有)
salesman_order_id  int          -- 主键
order_id           int          -- 订单ID
salesman_id        int          -- 分销员ID
amount             decimal(10,2)-- 收益总额(注意是 amount,不是 commission_amount)
order_amount       decimal(10,2)-- 订单商品金额
status             tinyint      -- 0待结算 1已结算
salesman_settlement_data text   -- 结算配置快照(json)

我一开始按习惯写了 commission_amount,跑起来报字段不存在,翻表才发现佣金列叫 amountSalesmanCustomer 记录"谁是谁拉来的",salesman_iduser_id,绑定关系一有,返佣就有依据。

补 C 端 Service

tigshop 前台 Service 放 php/app/service/front/,新建 salesman/SalesmanCenterService.php,把"我的分销数据"聚合出来:

<?php
namespace app\service\front\salesman;

use app\model\salesman\Salesman;
use app\model\salesman\SalesmanOrder;
use app\model\salesman\SalesmanCustomer;

class SalesmanCenterService
{
   
    // 分销中心首页数据
    public function overview(int $userId): array
    {
   
        $salesman = Salesman::where('user_id', $userId)->find();
        if (!$salesman) {
   
            return ['is_salesman' => 0];
        }
        $sid = $salesman->salesman_id;

        return [
            'is_salesman'     => 1,
            'salesman_id'     => $sid,
            'customer_count'  => SalesmanCustomer::where('salesman_id', $sid)->count(),
            'total_commission'=> SalesmanOrder::where('salesman_id', $sid)
                                    ->where('status', 1)->sum('amount'),
            'wait_commission' => SalesmanOrder::where('salesman_id', $sid)
                                    ->where('status', 0)->sum('amount'),
        ];
    }

    // 我的返佣订单
    public function orderList(int $userId, int $page, int $size): array
    {
   
        $salesman = Salesman::where('user_id', $userId)->find();
        if (!$salesman) return ['records' => [], 'total' => 0];

        $query = SalesmanOrder::where('salesman_id', $salesman->salesman_id)
            ->with(['orderUserInfo'])
            ->order('salesman_order_id', 'desc');

        return [
            'records' => $query->page($page, $size)->select(),
            'total'   => $query->count(),
        ];
    }
}

orderUserInfoSalesmanOrder 模型里现成的关联,能带出订单号、金额这些,不用自己 join。

补 C 端 Controller

照 tigshop 现有 controller 的写法:继承 IndexBaseController、构造注入 Service、返回 $this->success()。用户 id 直接从 request()->userId 取,跟 Address 那些控制器一致:

<?php
namespace app\api\controller\user;

use app\api\IndexBaseController;
use app\service\front\salesman\SalesmanCenterService;
use think\App;
use think\Response;

class Salesman extends IndexBaseController
{
   
    protected SalesmanCenterService $service;

    public function __construct(App $app, SalesmanCenterService $service)
    {
   
        parent::__construct($app);
        $this->service = $service;
    }

    public function center(): Response
    {
   
        $this->checkLogin();
        return $this->success($this->service->overview(request()->userId));
    }

    public function orderList(): Response
    {
   
        $this->checkLogin();
        $page = $this->request->all('page/d', 1);
        $size = $this->request->all('size/d', 15);
        return $this->success($this->service->orderList(request()->userId, $page, $size));
    }
}

挂路由

跟着 php/app/api/route/user.php 里 address / aftersales 那几组的写法加一段:

Route::group('salesman', function () {
   
    Route::get('center', 'user.salesman/center');
    Route::get('orderList', 'user.salesman/orderList');
})->middleware([\app\api\middleware\CheckLogin::class]);

返佣在哪触发

绑定关系有了,得在订单支付成功后记一笔返佣。tigshop 的支付回调在 php/app/api/controller/order/Pay.phpnotify,成功后我加了个钩子写 salesman_order

// 支付成功后:给上级分销员记一笔待结算
$customer = SalesmanCustomer::where('user_id', $order['user_id'])->find();
if ($customer) {
   
    SalesmanOrder::create([
        'salesman_id' => $customer->salesman_id,
        'order_id'    => $order['order_id'],
        'amount'      => bcmul($order['total_amount'], '0.10', 2), // 一级 10%
        'status'      => 0, // 待结算,确认收货后再转 1
    ]);
}

字段用 amount,别再写成 commission_amount。确认收货或者售后期过了,再跑个定时任务把 status 从 0 改成 1,宝塔计划任务加个 php think 命令定时扫一遍就行。

前端 Uniapp 分销中心页

Uniapp 的 api 定义统一放 view/Tigshop-Uniapp/src/api,我加了个 salesman.ts

// src/api/salesman.ts
import request from '@/utils/request'

export const getSalesmanCenter = () => request.get('/api/user/salesman/center')
export const getSalesmanOrders = (page = 1) =>
  request.get('/api/user/salesman/orderList', {
    page })

页面 src/pages/salesman/center.vue 拉数据展示:

<script setup lang="ts">
import { ref, onMounted } from 'vue'
import { getSalesmanCenter } from '@/api/salesman'

const info = ref<any>({})
onMounted(async () => { info.value = (await getSalesmanCenter()).data })
</script>

<template>
  <view v-if="info.is_salesman" class="center">
    <view>累计佣金:{
  { info.total_commission }}</view>
    <view>待结算:{
  { info.wait_commission }}</view>
    <view>我的客户:{
  { info.customer_count }} 人</view>
  </view>
  <view v-else>你还不是分销员</view>
</template>

这只补了一级返佣加分销中心,多级、团队、推广素材那些还是 Pro 的完整功能。但客户只想给老客户开个返佣的话,这几处改完就能跑。model 层留得全,补 C 端不用建表;真要做多级,可以顺着 SalesmanOrdersalesman_settlement_data 这个 json 字段往里塞层级快照。

相关文章
|
2月前
|
运维 安全 Java
为什么不建议从零开发商城?集体放弃自研,转向开源二开的核心原因
电商技术选型核心在于规避隐性成本:自研商城看似自由,实则长期维护、迭代、安全投入巨大;成熟开源系统可省60%无效开发。本文对比VortMall(高并发多业态)、TigShop(全开源Java/低二开成本)、Jinor(PHP轻量快启)等5大主流方案,聚焦架构弹性、源码透明、生态持续与场景匹配,助企业精准降本增效。
249 0
为什么不建议从零开发商城?集体放弃自研,转向开源二开的核心原因
|
30天前
|
NoSQL 前端开发 Redis
礼盒两件起售怎么拦?Tigshop开源商城我补了个min_buy
本方案为礼盒商品新增「起购数量」(min_buy)字段,与限购(limit_number)解耦:前者控制下限(如2件起购),后者控制上限。前后端双重校验,支持待付款占用、关单释放,管理后台可配,默认0不限。避免误用秒杀方案,轻量可靠。
|
10月前
|
数据采集 人工智能 自然语言处理
别让机器人“装人”:用数据把自动化客服变聪明
别让机器人“装人”:用数据把自动化客服变聪明
362 9
|
5月前
|
传感器 安全 芯片
沃虎电子:电流互感器在电力电子与工业测量中的选型与应用解析
本文系统解析电流互感器(CT)原理、关键参数(如匝数比、隔离耐压、频响)、选型要点及典型应用,涵盖测量、保护、开关电源采样和漏电检测四大场景,并结合沃虎电子多款型号实例说明,助力工程师精准选型与可靠设计。
574 2
|
8月前
|
存储 编解码 Cloud Native
全链路解析:基于云原生架构的 Bilibili 视频下载引擎实现
本文深入解析基于云原生架构的B站视频下载引擎,涵盖DASH协议分析、音视频分片下载、FFmpeg无损合成及阿里云Serverless部署。结合异步任务编排、OSS存储与反爬策略,实现高效、合规的全链路流媒体解析,适用于离线学习与弱网播放场景。(238字)
|
12月前
|
人工智能 Cloud Native 安全
超前探展!2025 云栖大会朋友圈晒图必备
2025 云栖大会设置人工智能+、计算、前沿应用三大主题馆,围绕云计算与 AI,全景式呈现展示 AI 时代云计算最新技术形态与产品进展。在计算馆,阿里云将集中展示从芯片到平台的全栈技术能力。观众可以了解到阿里云在超大规模集群、分布式训练、异构资源管理、推理加速等方面的软件能力,也能首次接触到面向推理和智能体需求的新一代硬件。如果你也一样,关注 AI 原生应用的创新和落地~请直奔计算馆 -「云原生 AI 应用开发」特展 !
|
Ubuntu 安全 Unix
CentOS 与 Ubuntu 谁与争锋
不论你的选择如何,是 Ubuntu 还是 CentOS,两者都是非常优秀稳定的发行版。如果你想要一个发布周期更短的版本,那么就选 Ubuntu;如果你想要一个不经常变更包的版本,那么就选 CentOS。在下方留下的评论,说出你更钟爱哪一个吧!
|
存储 SQL 大数据
【重磅发布】AllData数据中台核心功能:湖仓一体化平台
杭州奥零数据科技有限公司成立于2023年,专注于数据中台业务,维护开源项目AllData并提供商业版解决方案。AllData提供数据集成、存储、开发、治理及BI展示等一站式服务,支持AI大模型应用,助力企业高效利用数据价值。
【重磅发布】AllData数据中台核心功能:湖仓一体化平台
|
存储 开发工具 数据安全/隐私保护
git分支操作
git分支操作
|
IDE 开发工具 iOS开发
【10月更文挑战第3天】「Mac上学Python 3」入门篇3 - 安装Python与开发环境配置
本篇将详细介绍如何在Mac系统上安装Python,并配置Python开发环境。内容涵盖Python的安装、pip包管理工具的配置与国内镜像源替换、安装与配置PyCharm开发工具,以及通过PyCharm编写并运行第一个Python程序。通过本篇的学习,用户将完成Python开发环境的搭建,为后续的Python编程工作打下基础。
1607 2
【10月更文挑战第3天】「Mac上学Python 3」入门篇3 - 安装Python与开发环境配置