邻里互助支付与分佣对接方案
一、业务背景
项目定位:社区服务平台
核心功能:
- 商品销售(已有)
- 邻里互助服务(新增)
- 专业技工入驻
- 业主发布需求
- 技工接单服务
- 感谢费支付与分佣
二、业务流程设计
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 支付安全
- 订单状态校验:确保只有"待支付"状态的订单才能发起支付
- 重复支付防护:支付前检查订单是否已支付
- 金额一致性:支付金额必须与订单金额一致
- 回调验签:支付回调必须验证签名
7.2 分佣安全
- 幂等性:同一订单不能重复分佣
- 金额校验:分佣总额不能超过订单金额
- 事务控制:分佣操作必须在事务中完成
- 冻结机制:防止纠纷期间用户提现
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 法律合规
- 服务协议:明确平台、技工、业主三方责任
- 资质审核:技工必须提供相关资质证明
- 保险机制:建议购买服务保险
- 纠纷处理:设置纠纷仲裁流程
9.2 用户体验
- 透明计费:明确展示服务费、平台费
- 评价系统:建立技工信用体系
- 客服支持:提供纠纷处理渠道
- 消息通知:及时通知订单状态变化
9.3 技术风险
- 并发控制:防止订单重复接单
- 数据一致性:确保支付和分佣数据一致
- 异常处理:支付失败、分佣失败的回滚机制
- 监控告警:支付异常、分佣异常的实时告警
十、总结
本方案基于你现有的芋道框架和分佣系统,设计了一套完整的邻里互助支付与分佣对接方案,核心特点:
✅ 复用现有系统:最大化利用商城的支付和分佣模块
✅ 独立业务隔离:邻里互助作为独立业务模块,不影响商城
✅ 灵活分佣配置:支持技工、推荐人、平台三方分佣
✅ 完善安全机制:冻结期、幂等性、事务控制
✅ 易于扩展:预留扩展字段,支持未来功能迭代
如需要具体的代码实现或有任何疑问,随时告诉我!🚀