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