113 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			PHP
		
	
	
		
		
			
		
	
	
			113 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			PHP
		
	
	
|  | <?php | ||
|  | 
 | ||
|  | 
 | ||
|  | namespace app\common\command; | ||
|  | 
 | ||
|  | 
 | ||
|  | use app\common\enum\OrderEnum; | ||
|  | use app\common\model\CouponList; | ||
|  | use app\common\model\goods\Goods; | ||
|  | use app\common\model\goods\GoodsItem; | ||
|  | use app\common\model\order\Order; | ||
|  | 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 OrderClose extends Command | ||
|  | { | ||
|  |     protected function configure() | ||
|  |     { | ||
|  |         $this->setName('order_close') | ||
|  |             ->setDescription('关闭订单'); | ||
|  |     } | ||
|  | 
 | ||
|  |     protected function execute(Input $input, Output $output) | ||
|  |     { | ||
|  |         try { | ||
|  |             $time = time(); | ||
|  |             $order_cancel_time = ConfigServer::get('transaction', 'unpaid_order_cancel_time', 30) * 60; | ||
|  | 
 | ||
|  |             $model = new Order(); | ||
|  |             $order_list = $model->field(true) | ||
|  |                 ->whereRaw("create_time+$order_cancel_time < $time") | ||
|  |                 ->where([ | ||
|  |                     ['order_type', '<>', OrderEnum::TEAM_ORDER], | ||
|  |                     ['order_status', '=', OrderEnum::ORDER_STATUS_NO_PAID], | ||
|  |                     ['pay_status', '=', OrderEnum::PAY_STATUS_NO_PAID] | ||
|  |                 ])->with(['orderGoods']) | ||
|  |                 ->select()->toArray(); | ||
|  | 
 | ||
|  |             $order_ids          = []; //更新的订单
 | ||
|  |             $update_total_stock = []; //更新总库存
 | ||
|  |             $update_stock       = []; //更新规格库存
 | ||
|  |             $total_stock_num    = []; //总库存
 | ||
|  |             $stock_num          = []; //规格库存
 | ||
|  |             $update_coupon_ids  = []; //更新优惠券状态
 | ||
|  |             foreach ($order_list as $order) { | ||
|  |                 $order_ids[] = $order['id']; | ||
|  |                 //返回优惠券
 | ||
|  |                 if ($order['coupon_list_id']) { | ||
|  |                     $update_coupon_ids[] = $order['coupon_list_id']; | ||
|  |                 } | ||
|  | 
 | ||
|  |                 foreach ($order['orderGoods'] as $order_goods) { | ||
|  |                     //更新商品总库存数据
 | ||
|  |                     if (isset($update_total_stock[$order_goods['goods_id']])) { | ||
|  |                         $total_stock_num[$order_goods['goods_id']] = $total_stock_num[$order_goods['goods_id']] + $order_goods['goods_num']; | ||
|  |                         $update_total_stock[$order_goods['goods_id']]['stock'] = Db::raw('stock+' . $total_stock_num[$order_goods['goods_id']]); | ||
|  |                     } else { | ||
|  |                         $total_stock_num[$order_goods['goods_id']] = $order_goods['goods_num']; | ||
|  |                         $update_total_stock[$order_goods['goods_id']] = [ | ||
|  |                             'id' => $order_goods['goods_id'], | ||
|  |                             'stock' => Db::raw('stock+' . $total_stock_num[$order_goods['goods_id']]) | ||
|  |                         ]; | ||
|  |                     } | ||
|  |                     //更新商品规格库存数据
 | ||
|  |                     if (isset($update_stock[$order_goods['item_id']])) { | ||
|  |                         $stock_num[$order_goods['item_id']] = $stock_num[$order_goods['item_id']] + $order_goods['goods_num']; | ||
|  |                         $update_stock[$order_goods['item_id']]['stock'] = Db::raw('stock+' . $stock_num[$order_goods['item_id']]); | ||
|  |                     } else { | ||
|  |                         $stock_num[$order_goods['item_id']] = $order_goods['goods_num']; | ||
|  |                         $update_stock[$order_goods['item_id']] = [ | ||
|  |                             'id' => $order_goods['item_id'], | ||
|  |                             'stock' => Db::raw('stock+' . $stock_num[$order_goods['item_id']]) | ||
|  |                         ]; | ||
|  |                     } | ||
|  |                 } | ||
|  |             } | ||
|  | 
 | ||
|  |             // 更新订单状态为关闭
 | ||
|  |             if ($order_ids) { | ||
|  |                 $update_data = [ | ||
|  |                     'order_status' => OrderEnum::ORDER_STATUS_DOWN, | ||
|  |                     'update_time'  => $time, | ||
|  |                 ]; | ||
|  | 
 | ||
|  |                 $model->where(['id' => $order_ids])->update($update_data); | ||
|  |             } | ||
|  | 
 | ||
|  | 
 | ||
|  |             //批量更新库存
 | ||
|  |             if($update_total_stock){ | ||
|  |                 (new Goods())->saveAll(array_values($update_total_stock)); | ||
|  |                 (new GoodsItem())->saveAll(array_values($update_stock)); | ||
|  |             } | ||
|  | 
 | ||
|  |             if($update_coupon_ids){ | ||
|  |                 $update_coupon = [ | ||
|  |                     'status'        => 0, | ||
|  |                     'use_time'      => '', | ||
|  |                     'order_id'      => '', | ||
|  |                     'update_time'   => $time, | ||
|  |                 ]; | ||
|  |                 (new CouponList())->where(['id'=>$update_coupon_ids])->update($update_coupon); | ||
|  |             } | ||
|  | 
 | ||
|  |         } catch (\Exception $e) { | ||
|  |             Log::write('自动关闭订单异常:'.$e->getMessage()); | ||
|  |         } | ||
|  |     } | ||
|  | } |