邻里互助

zxbandzby
1
2026-02-09

邻里互助支付与分佣对接方案

一、业务背景

项目定位:社区服务平台
核心功能

  1. 商品销售(已有)
  2. 邻里互助服务(新增)
    • 专业技工入驻
    • 业主发布需求
    • 技工接单服务
    • 感谢费支付与分佣

二、业务流程设计

2.1 完整业务流程

【发布阶段】
业主发布需求(带预估感谢费)
    ↓
平台审核(可选)
    ↓
需求发布到技工端

【接单阶段】
技工浏览需求
    ↓
技工申请接单
    ↓
业主确认技工
    ↓
订单状态:待服务

【服务阶段】
技工上门服务
    ↓
技工标记服务完成
    ↓
订单状态:待确认

【支付阶段】
业主确认服务完成
    ↓
业主支付感谢费(支持微信/支付宝)
    ↓
订单状态:待结算

【分佣阶段】
系统自动触发分佣计算
    ↓
├─ 技工收益:70-80%
├─ 推荐人分佣:5-10%(如果有推荐关系)
└─ 平台服务费:10-20%
    ↓
各方可提现

2.2 订单状态流转

状态码状态名称说明
0待审核业主发布,等待平台审核
1待接单已发布,等待技工接单
2已接单技工已接单,待服务
3服务中技工正在服务
4待确认技工完成,待业主确认
5待支付业主确认,待支付感谢费
6已支付已支付,待分佣结算
7已完成已分佣,订单完成
8已取消订单取消
9有纠纷产生纠纷,待客服处理

三、数据库设计

3.1 邻里互助订单表(biz_help_order)

说明:将原来的 biz_help_put(需求发布表)转化为订单表,增加订单相关字段。

CREATE TABLE `biz_help_order` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '订单ID',
  
  -- ========== 需求信息 ==========
  `job_type` varchar(50) COMMENT '行业类别(水电维修、家政服务、搬家物流等)',
  `service_address` varchar(255) COMMENT '服务地址',
  `service_time` datetime COMMENT '预约服务时间',
  `service_range` varchar(255) COMMENT '服务范围说明',
  `require_info` text COMMENT '需求描述',
  `require_imgs` varchar(1000) COMMENT '需求图片(逗号分隔)',
  
  -- ========== 费用信息 ==========
  `estimate_price` int NOT NULL COMMENT '预估感谢费(单位:分)',
  `actual_price` int COMMENT '实际支付金额(单位:分)',
  
  -- ========== 业主信息 ==========
  `owner_user_id` bigint NOT NULL COMMENT '业主用户ID',
  `owner_name` varchar(50) COMMENT '业主姓名',
  `owner_mobile` varchar(20) COMMENT '业主手机号',
  
  -- ========== 技工信息 ==========
  `worker_user_id` bigint COMMENT '接单技工ID',
  `worker_name` varchar(50) COMMENT '技工姓名',
  `worker_mobile` varchar(20) COMMENT '技工手机号',
  `apply_time` datetime COMMENT '技工接单时间',
  
  -- ========== 订单状态 ==========
  `status` tinyint NOT NULL DEFAULT 0 COMMENT '订单状态(0待审核 1待接单 2已接单 3服务中 4待确认 5待支付 6已支付 7已完成 8已取消 9有纠纷)',
  `cancel_reason` varchar(500) COMMENT '取消原因',
  `cancel_time` datetime COMMENT '取消时间',
  
  -- ========== 服务记录 ==========
  `start_service_time` datetime COMMENT '开始服务时间',
  `finish_service_time` datetime COMMENT '完成服务时间',
  `service_imgs` varchar(1000) COMMENT '服务现场图片',
  `service_remark` text COMMENT '服务备注',
  
  -- ========== 确认评价 ==========
  `confirm_time` datetime COMMENT '业主确认时间',
  `rating` tinyint COMMENT '评分(1-5星)',
  `comment` text COMMENT '评价内容',
  
  -- ========== 支付信息 ==========
  `pay_order_id` bigint COMMENT '支付订单ID(关联 pay_order 表)',
  `pay_time` datetime COMMENT '支付时间',
  `pay_channel` varchar(50) COMMENT '支付渠道(wechat/alipay)',
  
  -- ========== 分佣信息 ==========
  `brokerage_status` tinyint DEFAULT 0 COMMENT '分佣状态(0未分佣 1已分佣)',
  `brokerage_time` datetime COMMENT '分佣时间',
  `worker_income` int COMMENT '技工收益(单位:分)',
  `platform_income` int COMMENT '平台收益(单位:分)',
  `referrer_income` int COMMENT '推荐人收益(单位:分)',
  `referrer_user_id` bigint COMMENT '推荐人用户ID',
  
  -- ========== 审核信息 ==========
  `check_status` tinyint DEFAULT 0 COMMENT '审核状态(0待审核 1已通过 2已拒绝)',
  `check_time` datetime COMMENT '审核时间',
  `check_user_id` bigint COMMENT '审核人ID',
  `check_reason` varchar(500) COMMENT '审核意见',
  
  -- ========== 基础字段 ==========
  `creator` varchar(64) DEFAULT '' COMMENT '创建者',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updater` varchar(64) DEFAULT '' COMMENT '更新者',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
  `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
  
  PRIMARY KEY (`id`),
  KEY `idx_owner_user_id` (`owner_user_id`),
  KEY `idx_worker_user_id` (`worker_user_id`),
  KEY `idx_status` (`status`),
  KEY `idx_create_time` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='邻里互助订单表';

3.2 技工信息表(biz_worker_info)

CREATE TABLE `biz_worker_info` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '技工ID',
  `user_id` bigint NOT NULL COMMENT '用户ID(关联 member_user)',
  
  -- ========== 基本信息 ==========
  `real_name` varchar(50) NOT NULL COMMENT '真实姓名',
  `mobile` varchar(20) NOT NULL COMMENT '手机号',
  `id_card` varchar(18) COMMENT '身份证号',
  `avatar` varchar(500) COMMENT '头像',
  
  -- ========== 技能信息 ==========
  `job_types` varchar(500) COMMENT '擅长类别(多选,逗号分隔)',
  `skill_description` text COMMENT '技能描述',
  `work_years` int COMMENT '从业年限',
  
  -- ========== 认证信息 ==========
  `cert_status` tinyint DEFAULT 0 COMMENT '认证状态(0未认证 1认证中 2已认证 3已拒绝)',
  `cert_imgs` varchar(1000) COMMENT '资质证书图片',
  `cert_time` datetime COMMENT '认证通过时间',
  
  -- ========== 推荐关系 ==========
  `referrer_user_id` bigint COMMENT '推荐人用户ID',
  `referrer_time` datetime COMMENT '推荐入驻时间',
  
  -- ========== 统计信息 ==========
  `total_orders` int DEFAULT 0 COMMENT '总接单数',
  `finished_orders` int DEFAULT 0 COMMENT '完成订单数',
  `rating_avg` decimal(3,2) DEFAULT 5.00 COMMENT '平均评分',
  `total_income` bigint DEFAULT 0 COMMENT '累计收益(单位:分)',
  
  -- ========== 状态信息 ==========
  `status` tinyint DEFAULT 1 COMMENT '状态(0禁用 1正常)',
  
  -- ========== 基础字段 ==========
  `creator` varchar(64) DEFAULT '' COMMENT '创建者',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updater` varchar(64) DEFAULT '' COMMENT '更新者',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
  `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
  
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_user_id` (`user_id`),
  KEY `idx_referrer_user_id` (`referrer_user_id`),
  KEY `idx_cert_status` (`cert_status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='技工信息表';

3.3 技工钱包表(biz_worker_wallet)

CREATE TABLE `biz_worker_wallet` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '钱包ID',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `worker_id` bigint NOT NULL COMMENT '技工ID',
  
  -- ========== 余额信息 ==========
  `balance` bigint NOT NULL DEFAULT 0 COMMENT '可用余额(单位:分)',
  `frozen_balance` bigint NOT NULL DEFAULT 0 COMMENT '冻结余额(单位:分)',
  `total_income` bigint NOT NULL DEFAULT 0 COMMENT '累计收入(单位:分)',
  `total_withdraw` bigint NOT NULL DEFAULT 0 COMMENT '累计提现(单位:分)',
  
  -- ========== 基础字段 ==========
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_user_id` (`user_id`),
  KEY `idx_worker_id` (`worker_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='技工钱包表';

3.4 技工流水表(biz_worker_wallet_log)

CREATE TABLE `biz_worker_wallet_log` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '流水ID',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `worker_id` bigint NOT NULL COMMENT '技工ID',
  
  -- ========== 变动信息 ==========
  `biz_type` tinyint NOT NULL COMMENT '业务类型(1订单收入 2提现 3退款 4平台调整)',
  `biz_id` varchar(64) COMMENT '业务编号',
  `change_amount` bigint NOT NULL COMMENT '变动金额(单位:分,正数增加,负数减少)',
  `balance_before` bigint NOT NULL COMMENT '变动前余额',
  `balance_after` bigint NOT NULL COMMENT '变动后余额',
  
  -- ========== 描述信息 ==========
  `title` varchar(255) COMMENT '标题',
  `description` varchar(500) COMMENT '描述',
  
  -- ========== 基础字段 ==========
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  
  PRIMARY KEY (`id`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_worker_id` (`worker_id`),
  KEY `idx_biz_type_id` (`biz_type`, `biz_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='技工钱包流水表';

四、分佣规则设计

4.1 分佣比例配置

在现有的 TradeConfigDO 中扩展邻里互助分佣配置:

/**
 * 邻里互助 - 技工收益比例(默认75%)
 */
private Integer helpWorkerIncomePercent;

/**
 * 邻里互助 - 平台服务费比例(默认20%)
 */
private Integer helpPlatformFeePercent;

/**
 * 邻里互助 - 推荐人分佣比例(默认5%)
 */
private Integer helpReferrerBrokeragePercent;

/**
 * 邻里互助 - 是否启用推荐分佣
 */
private Boolean helpReferrerBrokerageEnabled;

/**
 * 邻里互助 - 佣金冻结天数(防止纠纷)
 */
private Integer helpBrokerageFrozenDays;

4.2 分佣计算逻辑

示例:业主支付感谢费 100 元

用户支付:100 元
    ↓
支付渠道手续费(0.6%):0.6 元
平台实收:99.4 元
    ↓
系统分账:
├─ 技工收益(75%):100 × 75% = 75 元
├─ 推荐人分佣(5%):100 × 5% = 5 元
└─ 平台服务费(20%):100 × 20% = 20 元

实际扣款验证:
平台实收:99.4 元
需支付:75 + 5 = 80 元
平台留存:99.4 - 80 = 19.4 元 ✅

4.3 分佣触发时机

方案一:支付完成后立即分佣(推荐)

业主支付成功 
    ↓
技工收益冻结 7 天(防纠纷)
推荐人分佣冻结 7 天
    ↓
7 天后自动解冻,可提现

方案二:服务完成后分佣

业主确认服务完成
    ↓
技工收益立即到账(可提现)
推荐人分佣立即到账

五、技术实现方案

5.1 代码结构设计

yudao-module-biz/
├── controller/
│   ├── app/
│   │   ├── help/
│   │   │   ├── AppHelpOrderController.java        // 订单管理
│   │   │   ├── AppWorkerController.java           // 技工端
│   │   │   └── vo/
│   │   └── worker/
│   │       ├── AppWorkerWalletController.java     // 技工钱包
│   │       └── vo/
│   └── admin/
│       └── help/
│           ├── HelpOrderController.java           // 订单管理后台
│           ├── WorkerController.java              // 技工管理
│           └── vo/
├── service/
│   ├── help/
│   │   ├── HelpOrderService.java
│   │   ├── HelpOrderServiceImpl.java
│   │   └── handler/
│   │       ├── HelpOrderPayHandler.java           // 支付处理器
│   │       └── HelpOrderBrokerageHandler.java     // 分佣处理器
│   └── worker/
│       ├── WorkerService.java
│       ├── WorkerWalletService.java
│       └── WorkerWalletServiceImpl.java
├── dal/
│   ├── dataobject/
│   │   ├── help/
│   │   │   └── HelpOrderDO.java
│   │   └── worker/
│   │       ├── WorkerInfoDO.java
│   │       ├── WorkerWalletDO.java
│   │       └── WorkerWalletLogDO.java
│   └── mysql/
│       ├── help/
│       │   └── HelpOrderMapper.java
│       └── worker/
│           ├── WorkerInfoMapper.java
│           └── WorkerWalletMapper.java
└── enums/
    └── help/
        ├── HelpOrderStatusEnum.java
        └── WorkerCertStatusEnum.java

5.2 核心服务实现

5.2.1 支付处理器(HelpOrderPayHandler)

@Component
public class HelpOrderPayHandler implements TradeOrderHandler {
    
    @Resource
    private HelpOrderService helpOrderService;
    
    @Resource
    private PayOrderApi payOrderApi;
    
    /**
     * 创建支付订单
     */
    public Long createPayOrder(Long helpOrderId) {
        // 1. 查询邻里互助订单
        HelpOrderDO helpOrder = helpOrderService.getHelpOrder(helpOrderId);
        
        // 2. 创建支付订单
        PayOrderCreateReqDTO createReqDTO = new PayOrderCreateReqDTO()
            .setAppKey(orderProperties.getPayAppKey())
            .setUserIp(ServletUtils.getClientIP())
            .setUserId(helpOrder.getOwnerUserId())
            .setUserType(UserTypeEnum.MEMBER.getValue())
            // 商户订单信息
            .setMerchantOrderId("help-" + helpOrderId)
            .setSubject("邻里互助服务费")
            .setBody(helpOrder.getJobType() + " - " + helpOrder.getRequireInfo())
            // 金额信息
            .setPrice(helpOrder.getActualPrice())
            .setExpireTime(LocalDateTime.now().plusHours(2));
        
        // 3. 调用支付模块创建订单
        Long payOrderId = payOrderApi.createOrder(createReqDTO);
        
        // 4. 更新邻里互助订单的支付订单ID
        helpOrderService.updatePayOrderId(helpOrderId, payOrderId);
        
        return payOrderId;
    }
    
    /**
     * 支付成功回调
     */
    public void afterPaySuccess(Long helpOrderId) {
        // 1. 更新订单状态为已支付
        helpOrderService.updateOrderStatus(helpOrderId, 
            HelpOrderStatusEnum.PAID);
        
        // 2. 触发分佣逻辑
        helpOrderBrokerageHandler.handleBrokerage(helpOrderId);
    }
}

5.2.2 分佣处理器(HelpOrderBrokerageHandler)

@Component
public class HelpOrderBrokerageHandler {
    
    @Resource
    private HelpOrderService helpOrderService;
    
    @Resource
    private WorkerWalletService workerWalletService;
    
    @Resource
    private BrokerageRecordService brokerageRecordService;
    
    @Resource
    private TradeConfigService tradeConfigService;
    
    /**
     * 处理邻里互助分佣
     */
    @Transactional(rollbackFor = Exception.class)
    public void handleBrokerage(Long helpOrderId) {
        // 1. 查询订单和配置
        HelpOrderDO order = helpOrderService.getHelpOrder(helpOrderId);
        TradeConfigDO config = tradeConfigService.getTradeConfig();
        
        Integer payPrice = order.getActualPrice();
        
        // 2. 计算各方收益
        // 技工收益
        Integer workerIncome = MoneyUtils.calculateRatePriceFloor(
            payPrice, config.getHelpWorkerIncomePercent());
        
        // 平台服务费
        Integer platformIncome = MoneyUtils.calculateRatePriceFloor(
            payPrice, config.getHelpPlatformFeePercent());
        
        // 推荐人分佣
        Integer referrerIncome = 0;
        if (BooleanUtil.isTrue(config.getHelpReferrerBrokerageEnabled()) 
            && order.getReferrerUserId() != null) {
            referrerIncome = MoneyUtils.calculateRatePriceFloor(
                payPrice, config.getHelpReferrerBrokeragePercent());
        }
        
        // 3. 记录技工收益(考虑冻结期)
        LocalDateTime unfreezeTime = null;
        if (config.getHelpBrokerageFrozenDays() != null 
            && config.getHelpBrokerageFrozenDays() > 0) {
            unfreezeTime = LocalDateTime.now()
                .plusDays(config.getHelpBrokerageFrozenDays());
        }
        
        workerWalletService.addIncome(
            order.getWorkerUserId(),
            BizTypeEnum.HELP_ORDER,
            order.getId().toString(),
            workerIncome,
            "邻里互助服务费",
            unfreezeTime
        );
        
        // 4. 记录推荐人分佣(如果有)
        if (referrerIncome > 0) {
            brokerageRecordService.addBrokerage(
                order.getReferrerUserId(),
                BrokerageRecordBizTypeEnum.HELP_ORDER,
                order.getId().toString(),
                referrerIncome,
                "推荐技工分佣"
            );
        }
        
        // 5. 记录平台收益(用于统计)
        // TODO: 可选实现,记录到平台收益统计表
        
        // 6. 更新订单分佣信息
        helpOrderService.updateBrokerageInfo(helpOrderId, 
            workerIncome, platformIncome, referrerIncome);
    }
}

5.2.3 技工钱包服务(WorkerWalletService)

@Service
public class WorkerWalletServiceImpl implements WorkerWalletService {
    
    @Resource
    private WorkerWalletMapper workerWalletMapper;
    
    @Resource
    private WorkerWalletLogMapper workerWalletLogMapper;
    
    /**
     * 增加技工收益
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void addIncome(Long userId, BizTypeEnum bizType, String bizId,
                          Integer amount, String title, LocalDateTime unfreezeTime) {
        // 1. 获取或创建钱包
        WorkerWalletDO wallet = getOrCreateWallet(userId);
        
        // 2. 更新余额
        boolean frozen = unfreezeTime != null;
        WorkerWalletDO updateObj = new WorkerWalletDO()
            .setId(wallet.getId())
            .setTotalIncome(wallet.getTotalIncome() + amount);
        
        if (frozen) {
            // 冻结余额
            updateObj.setFrozenBalance(wallet.getFrozenBalance() + amount);
        } else {
            // 可用余额
            updateObj.setBalance(wallet.getBalance() + amount);
        }
        
        workerWalletMapper.updateById(updateObj);
        
        // 3. 记录流水
        WorkerWalletLogDO log = new WorkerWalletLogDO()
            .setUserId(userId)
            .setWorkerId(wallet.getWorkerId())
            .setBizType(bizType.getType())
            .setBizId(bizId)
            .setChangeAmount(amount)
            .setBalanceBefore(wallet.getBalance())
            .setBalanceAfter(wallet.getBalance() + (frozen ? 0 : amount))
            .setTitle(title)
            .setDescription(frozen ? "冻结中," + unfreezeTime + "解冻" : "已到账");
        
        workerWalletLogMapper.insert(log);
    }
    
    /**
     * 解冻余额(定时任务)
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void unfreezeBalance(Long userId, Long logId) {
        // 1. 查询流水
        WorkerWalletLogDO log = workerWalletLogMapper.selectById(logId);
        
        // 2. 更新钱包
        WorkerWalletDO wallet = workerWalletMapper.selectByUserId(userId);
        workerWalletMapper.updateById(new WorkerWalletDO()
            .setId(wallet.getId())
            .setBalance(wallet.getBalance() + log.getChangeAmount())
            .setFrozenBalance(wallet.getFrozenBalance() - log.getChangeAmount()));
        
        // 3. 更新流水状态
        log.setDescription("已解冻");
        workerWalletLogMapper.updateById(log);
    }
}

5.3 支付流程对接

5.3.1 App端支付接口

@RestController
@RequestMapping("/biz/help-order")
public class AppHelpOrderController {
    
    @Resource
    private HelpOrderService helpOrderService;
    
    @Resource
    private HelpOrderPayHandler helpOrderPayHandler;
    
    /**
     * 业主确认服务完成并发起支付
     */
    @PostMapping("/confirm-and-pay")
    @Operation(summary = "确认服务完成并支付")
    public CommonResult<PayOrderCreateRespVO> confirmAndPay(
            @RequestParam("orderId") Long orderId,
            @RequestParam("rating") Integer rating,
            @RequestParam(value = "comment", required = false) String comment) {
        
        // 1. 确认服务完成
        helpOrderService.confirmService(orderId, rating, comment);
        
        // 2. 创建支付订单
        Long payOrderId = helpOrderPayHandler.createPayOrder(orderId);
        
        // 3. 返回支付信息(调起微信/支付宝)
        PayOrderCreateRespVO payResp = payOrderApi.getPayOrder(payOrderId);
        
        return success(payResp);
    }
    
    /**
     * 支付成功回调(由支付模块调用)
     */
    @PostMapping("/pay-callback")
    @PermitAll
    public CommonResult<Boolean> payCallback(
            @RequestBody PayOrderNotifyReqDTO notifyReq) {
        
        // 1. 从商户订单号解析订单ID
        String merchantOrderId = notifyReq.getMerchantOrderId();
        if (!merchantOrderId.startsWith("help-")) {
            return success(false);
        }
        
        Long helpOrderId = Long.parseLong(merchantOrderId.substring(5));
        
        // 2. 触发支付成功处理
        helpOrderPayHandler.afterPaySuccess(helpOrderId);
        
        return success(true);
    }
}

六、分佣配置管理

6.1 扩展交易配置表

trade_config 表中新增字段:

ALTER TABLE `trade_config` 
ADD COLUMN `help_worker_income_percent` int DEFAULT 75 COMMENT '邻里互助-技工收益比例',
ADD COLUMN `help_platform_fee_percent` int DEFAULT 20 COMMENT '邻里互助-平台服务费比例',
ADD COLUMN `help_referrer_brokerage_percent` int DEFAULT 5 COMMENT '邻里互助-推荐人分佣比例',
ADD COLUMN `help_referrer_brokerage_enabled` bit(1) DEFAULT b'1' COMMENT '邻里互助-是否启用推荐分佣',
ADD COLUMN `help_brokerage_frozen_days` int DEFAULT 7 COMMENT '邻里互助-佣金冻结天数';

6.2 后台配置界面

在现有的 TradeConfigController 中增加邻里互助配置项即可。


七、关键技术要点

7.1 支付安全

  1. 订单状态校验:确保只有"待支付"状态的订单才能发起支付
  2. 重复支付防护:支付前检查订单是否已支付
  3. 金额一致性:支付金额必须与订单金额一致
  4. 回调验签:支付回调必须验证签名

7.2 分佣安全

  1. 幂等性:同一订单不能重复分佣
  2. 金额校验:分佣总额不能超过订单金额
  3. 事务控制:分佣操作必须在事务中完成
  4. 冻结机制:防止纠纷期间用户提现

7.3 提现管理

复用现有的分佣提现系统

  • 技工的服务费收益记录到 biz_worker_wallet
  • 推荐人的分佣收益记录到 trade_brokerage_user
  • 提现功能复用 BrokerageWithdrawService

八、实施步骤建议

第一阶段:数据库设计(1天)

  • 创建邻里互助订单表
  • 创建技工信息表
  • 创建技工钱包表
  • 扩展交易配置表

第二阶段:技工入驻功能(2-3天)

  • 技工注册/认证
  • 技工信息管理
  • 推荐关系绑定
  • 后台审核功能

第三阶段:订单基础功能(3-4天)

  • 业主发布需求
  • 技工接单
  • 服务流程管理
  • 订单状态流转

第四阶段:支付对接(2-3天)

  • 创建支付订单
  • 对接微信/支付宝支付
  • 支付回调处理
  • 支付状态同步

第五阶段:分佣实现(2-3天)

  • 分佣计算逻辑
  • 技工钱包管理
  • 推荐人分佣
  • 冻结/解冻机制

第六阶段:提现功能(1-2天)

  • 复用现有提现系统
  • 技工提现流程
  • 提现审核管理

第七阶段:测试优化(2-3天)

  • 功能测试
  • 支付测试
  • 分佣测试
  • 性能优化

总计:约 15-20 个工作日


九、注意事项

9.1 法律合规

  1. 服务协议:明确平台、技工、业主三方责任
  2. 资质审核:技工必须提供相关资质证明
  3. 保险机制:建议购买服务保险
  4. 纠纷处理:设置纠纷仲裁流程

9.2 用户体验

  1. 透明计费:明确展示服务费、平台费
  2. 评价系统:建立技工信用体系
  3. 客服支持:提供纠纷处理渠道
  4. 消息通知:及时通知订单状态变化

9.3 技术风险

  1. 并发控制:防止订单重复接单
  2. 数据一致性:确保支付和分佣数据一致
  3. 异常处理:支付失败、分佣失败的回滚机制
  4. 监控告警:支付异常、分佣异常的实时告警

十、总结

本方案基于你现有的芋道框架和分佣系统,设计了一套完整的邻里互助支付与分佣对接方案,核心特点:

复用现有系统:最大化利用商城的支付和分佣模块
独立业务隔离:邻里互助作为独立业务模块,不影响商城
灵活分佣配置:支持技工、推荐人、平台三方分佣
完善安全机制:冻结期、幂等性、事务控制
易于扩展:预留扩展字段,支持未来功能迭代

如需要具体的代码实现或有任何疑问,随时告诉我!🚀

动物装饰