413 lines
18 KiB
PHP
413 lines
18 KiB
PHP
<?php
|
|
|
|
|
|
namespace app\common\command;
|
|
|
|
|
|
use app\admin\logic\distribution\DistributionLevelLogic;
|
|
use app\common\enum\DistributionOrderGoodsEnum;
|
|
use app\common\model\AccountLog;
|
|
use app\common\model\after_sale\AfterSale;
|
|
use app\common\model\distribution\DistributionOrderGoods;
|
|
use app\common\model\order\Order;
|
|
use app\common\model\user\User;
|
|
use app\common\server\ConfigServer;
|
|
use think\console\Command;
|
|
use think\console\Input;
|
|
use think\console\Output;
|
|
use think\facade\Db;
|
|
use think\facade\Log;
|
|
|
|
use app\common\model\shop\Shop;
|
|
|
|
class DistributionOrder extends Command
|
|
{
|
|
protected function configure()
|
|
{
|
|
$this->setName('distribution_order')
|
|
->setDescription('结算分销订单');
|
|
}
|
|
|
|
protected function execute(Input $input, Output $output)
|
|
{
|
|
Db::startTrans();
|
|
try {
|
|
// 1、获取结算时间
|
|
$time = time();
|
|
$afterSaleTime = ConfigServer::get('distribution', 'settlement_days', 7);
|
|
$afterSaleTime = intval($afterSaleTime * 24 * 60 * 60);
|
|
|
|
//2.查询所有未分销结算的订单,推荐人提成计算 //无相增加
|
|
$promotionOrders = Order::alias('O')
|
|
->field(['O.id','O.order_sn','O.total_amount','U.first_leader','U.second_leader','U.third_leader','S.id as sid','U.id as uid','S.trade_promotion_fee','S.promotion_buy_fee','S.team_first_fee','S.team_second_fee','S.team_third_fee'])
|
|
->join('shop S','O.shop_id = S.id')
|
|
->join('shop_admin SA','O.shop_id = SA.shop_id')
|
|
->join('shop_apply SAP','SAP.account = SA.account')
|
|
->join('procurement U','SAP.user_id = U.id')
|
|
->whereRaw("O.confirm_take_time+$afterSaleTime < $time")
|
|
->where([['O.confirm_take_time', '>', 0],['O.promotion_settle',"=",0],['S.type','=',2]]) //已确认收货且没有结算的订单,商家为入驻商家
|
|
->limit(100)
|
|
->select()->toArray();
|
|
foreach ($promotionOrders as &$order) {
|
|
|
|
// 增加用户佣金,推广者如果是个人,就直接返推广点,否者按推广层级进行返点
|
|
|
|
// 商家钱包金额
|
|
$wallet = Shop::where('id', $order['sid'])->value('wallet'); //商家减去佣金
|
|
//先执行推荐购买返点
|
|
$buyer = User::where('id', $order['user_id'])->find(); //购买者
|
|
$earnings_buy = User::where('id', $buyer['first_leader'])->value('earnings');
|
|
if($earnings_buy){ //如果购买者有推荐人,就发推荐奖励
|
|
$money_buy = $order['total_amount'] * $order['promotion_buy_fee'] / 100;
|
|
User::update([
|
|
'earnings' => $earnings_buy + $money_buy,
|
|
'update_time' => $time,
|
|
'id' => $buyer['first_leader']
|
|
]);
|
|
|
|
Shop::update([
|
|
'wallet' => $wallet - $money_buy,
|
|
'update_time' => $time,
|
|
'id' => $order['sid']
|
|
]);
|
|
|
|
// 记录流水
|
|
AccountLog::create([
|
|
'log_sn' => createSn('account_log', 'log_sn', '', 4),
|
|
'user_id' => $buyer['first_leader'],
|
|
'source_type' => AccountLog::distribution_inc_earnings,
|
|
'source_id' => $order['id'],
|
|
'source_sn' => $order['order_sn'],
|
|
'change_amount' => $money_buy,
|
|
'left_amount' => $earnings_buy+$money_buy,
|
|
'change_type' => 1,
|
|
'remark' => '推广佣金增加'
|
|
]);
|
|
// 记录流水
|
|
AccountLog::create([
|
|
'log_sn' => createSn('account_log', 'log_sn', '', 4),
|
|
'user_id' => $order['uid'],
|
|
'source_type' => AccountLog::shop_reduce_wallet,
|
|
'source_id' => $order['id'],
|
|
'source_sn' => $order['order_sn'],
|
|
'change_amount' => $money_buy,
|
|
'left_amount' => $wallet - $money_buy,
|
|
'change_type' => 1,
|
|
'remark' => '商铺钱包余额减少'
|
|
]);
|
|
|
|
}
|
|
|
|
//获取店铺
|
|
|
|
$promoter = User::where('id', $order['first_leader'])->find(); //查询推广者
|
|
if($promoter){
|
|
|
|
if(!$promoter["is_team"]){ //不是团队就直接分账
|
|
$earnings = User::where('id', $order['first_leader'])->value('earnings'); //给推广者增加佣金
|
|
$money = $order['total_amount'] * $order['trade_promotion_fee'] / 100;
|
|
User::update([
|
|
'earnings' => $earnings + $money,
|
|
'update_time' => $time,
|
|
'id' => $order['first_leader']
|
|
]);
|
|
|
|
|
|
Shop::update([
|
|
'wallet' => $wallet - $money,
|
|
'update_time' => $time,
|
|
'id' => $order['sid']
|
|
]);
|
|
|
|
// 记录流水
|
|
AccountLog::create([
|
|
'log_sn' => createSn('account_log', 'log_sn', '', 4),
|
|
'user_id' => $order['first_leader'],
|
|
'source_type' => AccountLog::distribution_inc_earnings,
|
|
'source_id' => $order['id'],
|
|
'source_sn' => $order['order_sn'],
|
|
'change_amount' => $money,
|
|
'left_amount' => $earnings+$money,
|
|
'change_type' => 1,
|
|
'remark' => '推广佣金增加'
|
|
]);
|
|
// 记录流水
|
|
AccountLog::create([
|
|
'log_sn' => createSn('account_log', 'log_sn', '', 4),
|
|
'user_id' => $order['uid'],
|
|
'source_type' => AccountLog::shop_reduce_wallet,
|
|
'source_id' => $order['id'],
|
|
'source_sn' => $order['order_sn'],
|
|
'change_amount' => $money,
|
|
'left_amount' => $wallet - $money,
|
|
'change_type' => 1,
|
|
'remark' => '商铺钱包余额减少'
|
|
]);
|
|
}else{ //如果是团队需要按三级分成
|
|
//一级
|
|
$earnings = User::where('id', $order['first_leader'])->value('earnings'); //给推广者增加佣金
|
|
$money = $order['total_amount'] * $order['team_first_fee'] / 100;
|
|
User::update([
|
|
'earnings' => $earnings + $money,
|
|
'update_time' => $time,
|
|
'id' => $order['first_leader']
|
|
]);
|
|
|
|
|
|
Shop::update([
|
|
'wallet' => $wallet - $money,
|
|
'update_time' => $time,
|
|
'id' => $order['sid']
|
|
]);
|
|
|
|
// 记录流水
|
|
AccountLog::create([
|
|
'log_sn' => createSn('account_log', 'log_sn', '', 4),
|
|
'user_id' => $order['first_leader'],
|
|
'source_type' => AccountLog::distribution_inc_earnings,
|
|
'source_id' => $order['id'],
|
|
'source_sn' => $order['order_sn'],
|
|
'change_amount' => $money,
|
|
'left_amount' => $earnings+$money,
|
|
'change_type' => 1,
|
|
'remark' => '推广佣金增加'
|
|
]);
|
|
// 记录流水
|
|
AccountLog::create([
|
|
'log_sn' => createSn('account_log', 'log_sn', '', 4),
|
|
'user_id' => $order['uid'],
|
|
'source_type' => AccountLog::shop_reduce_wallet,
|
|
'source_id' => $order['id'],
|
|
'source_sn' => $order['order_sn'],
|
|
'change_amount' => $money,
|
|
'left_amount' => $wallet - $money,
|
|
'change_type' => 1,
|
|
'remark' => '商铺钱包余额减少'
|
|
]);
|
|
|
|
//二级
|
|
// $promoter_2 = User::where('id', $order['second_leader'])->find(); //给推广者增加佣金
|
|
// if($promoter_2){
|
|
// $earnings = User::where('id', $order['second_leader'])->value('earnings'); //给推广者增加佣金
|
|
// $money = $order['total_amount'] * $order['team_second_fee'] / 100;
|
|
// User::update([
|
|
// 'earnings' => $earnings + $money,
|
|
// 'update_time' => $time,
|
|
// 'id' => $order['second_leader']
|
|
// ]);
|
|
//
|
|
//
|
|
// Shop::update([
|
|
// 'wallet' => $wallet - $money,
|
|
// 'update_time' => $time,
|
|
// 'id' => $order['sid']
|
|
// ]);
|
|
//
|
|
// // 记录流水
|
|
// AccountLog::create([
|
|
// 'log_sn' => createSn('account_log', 'log_sn', '', 4),
|
|
// 'user_id' => $order['second_leader'],
|
|
// 'source_type' => AccountLog::distribution_inc_earnings,
|
|
// 'source_id' => $order['id'],
|
|
// 'source_sn' => $order['order_sn'],
|
|
// 'change_amount' => $money,
|
|
// 'left_amount' => $earnings+$money,
|
|
// 'change_type' => 1,
|
|
// 'remark' => '推广佣金增加'
|
|
// ]);
|
|
// // 记录流水
|
|
// AccountLog::create([
|
|
// 'log_sn' => createSn('account_log', 'log_sn', '', 4),
|
|
// 'user_id' => $order['uid'],
|
|
// 'source_type' => AccountLog::shop_reduce_wallet,
|
|
// 'source_id' => $order['id'],
|
|
// 'source_sn' => $order['order_sn'],
|
|
// 'change_amount' => $money,
|
|
// 'left_amount' => $wallet - $money,
|
|
// 'change_type' => 1,
|
|
// 'remark' => '商铺钱包余额减少'
|
|
// ]);
|
|
// }
|
|
//
|
|
|
|
//三级
|
|
// $promoter_3 = User::where('id', $order['third_leader'])->find(); //给推广者增加佣金
|
|
// if($promoter_3){
|
|
// $earnings = User::where('id', $order['third_leader'])->value('earnings'); //给推广者增加佣金
|
|
// $money = $order['total_amount'] * $order['team_third_fee'] / 100;
|
|
// User::update([
|
|
// 'earnings' => $earnings + $money,
|
|
// 'update_time' => $time,
|
|
// 'id' => $order['third_leader']
|
|
// ]);
|
|
//
|
|
//
|
|
// Shop::update([
|
|
// 'wallet' => $wallet - $money,
|
|
// 'update_time' => $time,
|
|
// 'id' => $order['sid']
|
|
// ]);
|
|
//
|
|
// // 记录流水
|
|
// AccountLog::create([
|
|
// 'log_sn' => createSn('account_log', 'log_sn', '', 4),
|
|
// 'user_id' => $order['third_leader'],
|
|
// 'source_type' => AccountLog::distribution_inc_earnings,
|
|
// 'source_id' => $order['id'],
|
|
// 'source_sn' => $order['order_sn'],
|
|
// 'change_amount' => $money,
|
|
// 'left_amount' => $earnings+$money,
|
|
// 'change_type' => 1,
|
|
// 'remark' => '推广佣金增加'
|
|
// ]);
|
|
// // 记录流水
|
|
// AccountLog::create([
|
|
// 'log_sn' => createSn('account_log', 'log_sn', '', 4),
|
|
// 'user_id' => $order['uid'],
|
|
// 'source_type' => AccountLog::shop_reduce_wallet,
|
|
// 'source_id' => $order['id'],
|
|
// 'source_sn' => $order['order_sn'],
|
|
// 'change_amount' => $money,
|
|
// 'left_amount' => $wallet - $money,
|
|
// 'change_type' => 1,
|
|
// 'remark' => '商铺钱包余额减少'
|
|
// ]);
|
|
// }
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
//更新订单推广状态
|
|
Order::update([
|
|
'promotion_settle' => 1,
|
|
'update_time' => $time,
|
|
'id' => $order['id']
|
|
]);
|
|
|
|
}
|
|
|
|
|
|
|
|
// 3、查询可以结算的订单
|
|
$model = new DistributionOrderGoods();
|
|
$orders = $model->alias('DOG')->field([
|
|
'O.id as order_id, O.order_status, O.confirm_take_time',
|
|
'DOG.id as distribution_id, DOG.sn, DOG.money',
|
|
'DOG.user_id, DOG.order_goods_id'
|
|
])
|
|
->join('order_goods OG', 'OG.id = DOG.order_goods_id')
|
|
->join('order O', 'O.id = OG.order_id')
|
|
->whereRaw("O.confirm_take_time+$afterSaleTime < $time")
|
|
->where([
|
|
['DOG.status', '=', DistributionOrderGoodsEnum::STATUS_WAIT_HANDLE],
|
|
])
|
|
->limit(100)
|
|
->select()->toArray();
|
|
|
|
foreach ($orders as &$order) {
|
|
//当前分佣订单是否可结算
|
|
if (false === self::isSettle($order)) {
|
|
continue;
|
|
}
|
|
|
|
// 增加用户佣金
|
|
$earnings = User::where('id', $order['user_id'])->value('earnings');
|
|
User::update([
|
|
'earnings' => $earnings + $order['money'],
|
|
'update_time' => $time,
|
|
'id' => $order['user_id']
|
|
]);
|
|
|
|
// 记录流水
|
|
AccountLog::create([
|
|
'log_sn' => createSn('account_log', 'log_sn', '', 4),
|
|
'user_id' => $order['user_id'],
|
|
'source_type' => AccountLog::distribution_inc_earnings,
|
|
'source_id' => $order['distribution_id'],
|
|
'source_sn' => $order['sn'],
|
|
'change_amount' => $order['money'],
|
|
'left_amount' => $earnings+$order['money'],
|
|
'change_type' => 1,
|
|
'remark' => '分销佣金增加'
|
|
]);
|
|
|
|
// 更新分销订单状态
|
|
DistributionOrderGoods::update([
|
|
'status' => DistributionOrderGoodsEnum::STATUS_SUCCESS,
|
|
'update_time' => $time,
|
|
'settlement_time' => $time,
|
|
'id'=>$order['distribution_id']
|
|
]);
|
|
|
|
// 更新订单分销佣金
|
|
$orderModel = Order::findOrEmpty($order['order_id']);
|
|
$orderModel->distribution_money = $orderModel->distribution_money + $order['money'];
|
|
$orderModel->update_time = $time;
|
|
$orderModel->save();
|
|
|
|
// 更新分销会员等级
|
|
DistributionLevelLogic::updateDistributionLevel($order['user_id']);
|
|
|
|
}
|
|
|
|
Db::commit();
|
|
} catch (\Exception $e) {
|
|
Db::rollback();
|
|
Log::write('分销结算异常:'.$e->getMessage());
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @Notes: 是否可以结算分佣订单 (检查是否有售后记录 没有则可结算, 有则需要检查售后记录状态)
|
|
* @Author: 张无忌
|
|
* @param $order
|
|
* @return bool
|
|
*/
|
|
protected function isSettle($order)
|
|
{
|
|
// 订单是否在售后(正在退款或已退款)
|
|
$check = (new AfterSale())->where([
|
|
'order_id' => $order['order_id'],
|
|
'order_goods_id' => $order['order_goods_id'],
|
|
'del'=>0
|
|
])->findOrEmpty()->toArray();
|
|
|
|
if (!$check) {
|
|
return true;
|
|
}
|
|
|
|
// 有售后订单记录且状态 $no_settlement中的 不结算分佣订单
|
|
$no_settlement = [
|
|
AfterSale::STATUS_APPLY_REFUND, //申请退款
|
|
AfterSale::STATUS_WAIT_RETURN_GOODS, //商品待退货
|
|
AfterSale::STATUS_WAIT_RECEIVE_GOODS, //商家待收货
|
|
];
|
|
|
|
// 不结算且分佣订单改为已失效
|
|
$set_fail = [
|
|
AfterSale::STATUS_WAIT_REFUND, //等待退款
|
|
AfterSale::STATUS_SUCCESS_REFUND, //退款成功
|
|
];
|
|
|
|
// 售后情况不明 不结算
|
|
if (in_array($check['status'], $no_settlement)) {
|
|
return false;
|
|
}
|
|
|
|
// 分佣订单更新为已失效 不结算
|
|
if (in_array($check['status'], $set_fail)) {
|
|
DistributionOrderGoods::update([
|
|
'status' => DistributionOrderGoodsEnum::STATUS_ERROR,
|
|
'update_time' => time()
|
|
], ['id'=>$order['distribution_id']]);
|
|
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
} |