dlhmaster/app/common/command/DistributionOrder.php
2024-06-06 11:06:09 +08:00

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;
}
}