setName('order_close') ->setDescription('关闭订单'); } protected function execute(Input $input, Output $output) { //是否下单扣库存 todo 默认是下单扣库存 $deduct_type = ConfigServer::get('trading', 'deduct_type', 1); //取消订单时长 todo 默认是30分钟 $order_cancel_time = ConfigServer::get('trading','order_cancel', 30) * 60; $now = time(); if ($order_cancel_time == 0) { return false; } $order = new Order(); $where[] = ['order_status','=',\app\common\model\Order::STATUS_WAIT_PAY]; $where[] = ['pay_status','=',Pay::UNPAID]; $order_list = $order ->where($where) ->where(Db::raw("create_time+$order_cancel_time < $now")) ->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']; } //更新积分 if($order['use_integral'] > 0){ Db::name('user')->where(['id'=>$order['user_id']])->setInc('user_integral',$order['use_integral']); AccountLogLogic::AccountRecord( $order['user_id'], $order['use_integral'], 1, AccountLog::cancel_order_refund_integral ); } //更新库存 if($deduct_type){ foreach ($order['order_goods'] 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' => \app\common\model\Order::STATUS_CLOSE, 'update_time' => $now, ]; Db::name('order')->where(['id'=>$order_ids])->update($update_data); } //批量更新库存 if($update_total_stock){ $goods = new Goods(); $goods_item = new GoodsItem(); $goods->saveAll(array_values($update_total_stock)); $goods_item->saveAll(array_values($update_stock)); } //更新优惠券 if($update_coupon_ids){ $update_coupon = [ 'status' => 0, 'use_time' => '', 'order_id' => '', 'update_time' => $now, ]; Db::name('coupon_list')->where(['id'=>$update_coupon_ids])->update($update_coupon); } } }