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