156 lines
5.4 KiB
PHP
156 lines
5.4 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;
|
|
|
|
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、查询可以结算的订单
|
|
$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;
|
|
}
|
|
} |