setName('shopro:partner:accept') ->setDescription('跑通收益中心全角色验收剧本:V5极差/平级、馆县拆分、30日暂停、退款、日结'); } protected function execute(Input $input, Output $output) { $goodsId = Db::name('shopro_commission_goods')->where('status', 1)->value('goods_id'); if (!$goodsId) { $output->writeln('no commission goods'); return 1; } $goods = Db::name('shopro_goods')->where('id', $goodsId)->find(); $service = new PartnerRewardService(); $yesterday = date('Y-m-d', strtotime('-1 day')); $yTime = strtotime($yesterday . ' 12:00:00'); $users = Db::transaction(function () use ($goods, $service, $yTime) { $e = $this->ensureUser('13800000005', '验收区县E'); $d = $this->ensureUser('13800000004', '验收酒道馆D', $e['id']); $a = $this->ensureUser('13800000001', '测试品酒师A', $d['id']); $b = $this->ensureUser('13800000002', '测试买家B', $a['id']); $c = $this->ensureUser('13800000006', '验收创客C', $b['id']); $x = $this->ensureUser('13800000007', '验收买家X', $c['id']); $this->ensureAgent($e['id'], 1, ['is_county' => 1, 'county_code' => '110101']); $this->ensureAgent($d['id'], 7, ['is_venue' => 1]); // V6 $this->ensureAgent($a['id'], 1); $this->ensureAgent($b['id'], 6); // V5 $this->ensureAgent($c['id'], 6); // V5 $this->ensureAgent($x['id'], 1); // 活跃:各受益人先自购一笔(金额 1) foreach ([$e, $d, $a, $b, $c] as $u) { $o = $this->createPaidOrder($u['id'], $goods, 1); $service->touchSelfOrder($u['id'], $o['paid_time']); } // 步骤4:X 下 1398 → C 极差100,B 平级10,D 馆50,E 县50,C 推三398 $orderX = $this->createPaidOrder($x['id'], $goods, 1398); $service->touchSelfOrder($x['id'], $orderX['paid_time']); $service->settleOrder($orderX['id']); // 步骤6:A 自购时间改到 31 天前,Y 挂在 A 下下一单 → A push3 skip $aInactiveAt = time() - 31 * 86400; Db::name('shopro_commission_agent')->where('user_id', $a['id'])->update([ 'last_self_order_time' => $aInactiveAt, ]); $y = $this->ensureUser('13800000008', '验收暂停测Y', $a['id']); $this->ensureAgent($y['id'], 1); $orderY = $this->createPaidOrder($y['id'], $goods, 1398); $service->touchSelfOrder($y['id'], $orderY['paid_time']); $service->settleOrder($orderY['id']); // 步骤7:退 X 单 $service->refund($orderX['id']); // 步骤8:补一笔「昨天」合格单供日结(挂在活跃的 B 下,买家 Z) $z = $this->ensureUser('13800000009', '验收日结Z', $b['id']); $this->ensureAgent($z['id'], 1); // 恢复 B/D/E 活跃 foreach ([$b, $d, $e] as $u) { $service->touchSelfOrder($u['id'], $yTime); } $orderZ = $this->createPaidOrder($z['id'], $goods, 1398, $yTime); $service->touchSelfOrder($z['id'], $yTime); $service->settleOrder($orderZ['id']); $yd = date('Y-m-d', $yTime); Db::name('shopro_partner_voucher_plan')->where('order_id', $orderZ['id'])->update([ 'start_date' => $yd, 'released_days' => 0, 'released_amount' => 0, 'status' => 1, ]); foreach ([$e, $d, $a, $b, $c, $x, $y, $z] as $u) { (new AgentService($u['id']))->runAgentUpgradePlan(false); } return compact('a', 'b', 'c', 'd', 'e', 'x', 'y', 'z', 'orderX', 'orderY', 'orderZ') + ['settle_date' => $yd]; }); $settleDate = $users['settle_date'] ?? $yesterday; $report1 = (new DailySettleService())->run($settleDate, true); $report2 = (new DailySettleService())->run($settleDate, true); $output->writeln('=== 验收账号 ==='); foreach (['e' => '区县E', 'd' => '馆D-V6', 'a' => '品酒师A', 'b' => '创客B-V5', 'c' => '创客C-V5', 'x' => '买家X'] as $k => $label) { $u = $users[$k]; $output->writeln("{$label} id={$u['id']} mobile={$u['mobile']}"); } $this->dumpRewards($output, '步骤4 X单(已退)', $users['orderX']['id']); $this->dumpRewards($output, '步骤6 Y单(A暂停)', $users['orderY']['id']); $this->dumpRewards($output, '步骤8 昨日Z单', $users['orderZ']['id']); $output->writeln('=== 日结 ==='); $output->writeln('settle1 gmv=' . ($report1['gmv'] ?? $report1->gmv ?? '') . ' madow=' . ($report1['madow_pool'] ?? $report1->madow_pool ?? '')); $output->writeln('settle2(重跑) gmv=' . ($report2['gmv'] ?? $report2->gmv ?? '') . ' madow=' . ($report2['madow_pool'] ?? $report2->madow_pool ?? '')); $madowCount = Db::name('shopro_partner_reward')->where('settle_date', $settleDate)->where('reward_type', 'madow_share')->where('status', 1)->count(); $venueShare = Db::name('shopro_partner_reward')->where('settle_date', $settleDate)->where('reward_type', 'venue_share')->where('status', 1)->sum('amount'); $countyShare = Db::name('shopro_partner_reward')->where('settle_date', $settleDate)->where('reward_type', 'county_share')->where('status', 1)->sum('amount'); $voucherRel = Db::name('shopro_partner_reward')->where('settle_date', $settleDate)->where('reward_type', 'voucher_release')->where('status', 1)->sum('amount'); $output->writeln("日结发放 madow笔={$madowCount} venue_share={$venueShare} county_share={$countyShare} voucher_release={$voucherRel}"); $output->writeln('shopro:partner:accept done'); return 0; } protected function dumpRewards(Output $output, $title, $orderId) { $output->writeln("=== {$title} order={$orderId} ==="); $rows = Db::name('shopro_partner_reward')->where('order_id', $orderId)->select(); foreach ($rows as $row) { $ext = json_decode($row['ext'] ?: '{}', true) ?: []; $output->writeln(sprintf( ' %s user=%s amount=%s status=%s %s', $row['reward_type'], $row['user_id'], $row['amount'], $row['status'], $ext['formula'] ?? ($ext['skip_reason'] ?? '') )); } } protected function ensureUser($mobile, $nickname, $parentId = 0) { $user = Db::name('user')->where('mobile', $mobile)->find(); if ($user) { $update = ['nickname' => $nickname]; if ($parentId) { $update['parent_user_id'] = $parentId; } Db::name('user')->where('id', $user['id'])->update($update); return Db::name('user')->where('id', $user['id'])->find(); } $salt = Random::alnum(); $now = time(); $id = Db::name('user')->insertGetId([ 'group_id' => 1, 'username' => $mobile, 'nickname' => $nickname, 'mobile' => $mobile, 'password' => md5(md5('Demo123456') . $salt), 'salt' => $salt, 'status' => 'normal', 'parent_user_id' => $parentId, 'jointime' => $now, 'createtime' => $now, 'updatetime' => $now, ]); return Db::name('user')->where('id', $id)->find(); } protected function ensureAgent($userId, $level, $extra = []) { $now = time(); $data = array_merge([ 'level' => $level, 'status' => 'normal', 'is_venue' => 0, 'is_county' => 0, 'county_code' => '', 'updatetime' => $now, ], $extra); $agent = Db::name('shopro_commission_agent')->where('user_id', $userId)->find(); if ($agent) { Db::name('shopro_commission_agent')->where('user_id', $userId)->update($data); return; } $data['user_id'] = $userId; $data['apply_num'] = 1; $data['become_time'] = $now; $data['createtime'] = $now; Db::name('shopro_commission_agent')->insert($data); } protected function createPaidOrder($userId, $goods, $payFee, $paidTime = null) { $now = $paidTime ?: time(); $orderId = Db::name('shopro_order')->insertGetId([ 'type' => 'goods', 'order_sn' => 'PA' . date('YmdHis', $now) . Random::numeric(4), 'user_id' => $userId, 'goods_original_amount' => $payFee, 'goods_amount' => $payFee, 'order_amount' => $payFee, 'pay_fee' => $payFee, 'remain_pay_fee' => 0, 'status' => 'paid', 'paid_time' => $now, 'pay_mode' => 'online', 'platform' => 'H5', 'ext' => json_encode(['partner_accept' => 1], JSON_UNESCAPED_UNICODE), 'createtime' => $now, 'updatetime' => $now, ]); Db::name('shopro_order_item')->insert([ 'order_id' => $orderId, 'user_id' => $userId, 'goods_id' => $goods['id'], 'goods_type' => 'normal', 'goods_title' => $goods['title'] ?? 'demo', 'goods_image' => $goods['image'] ?? '', 'goods_original_price' => $payFee, 'goods_price' => $payFee, 'goods_num' => 1, 'pay_fee' => $payFee, 'ext' => json_encode(['is_commission' => 1, 'partner_accept' => 1], JSON_UNESCAPED_UNICODE), 'createtime' => $now, 'updatetime' => $now, ]); return [ 'id' => $orderId, 'user_id' => $userId, 'pay_fee' => $payFee, 'paid_time' => $now, 'status' => 'paid', ]; } }