request->isGet) { return $this->error('请求方式错误'); } $page = \Yii::$app->request->get('page', 1); $limit = \Yii::$app->request->get('limit', $this->pageSize); $wheres[] = ['mall_id' => $this->mall_id, 'user_id' => $this->user_id, 'status' => StatusEnum::ENABLED]; $params = [ 'select' => 'id,mall_id,user_id,goods_id,num,address,express_no,express_code,send_status,mobile,name,created_at,remark,seller_remark', 'where' => $wheres, 'order' => 'created_at desc', 'page' => $page, 'limit' => $limit, 'with' => [ 'details' => function ($query) { $query ->where(['status' => StatusEnum::ENABLED]) ->select('goods_id, num, order_id') ->with([ 'goods' => function ($query) { $query->select('id, goods_name, cover_pic'); } ]); } ] ]; $orders = CloudStockAgentOrder::listPage($params); if (empty($orders['list'])) { if (is_array($orders['list'])) { return $this->success('success', $orders); } else { return $this->error('获取自提订单失败:' . CloudStockAgentOrder::getStaticError()); } } $send_status_map = CloudStockEnum::getAgentOrdetStatusMap(); $orders['send_status_map'] = $send_status_map; $setting =\Yii::$app->services->setting->addons->get($this->mall_id, AddonsEnum::ADDONS_NAME_CLOUD_STOCK, 'basic'); $orders['is_show_update_address'] = $setting['is_show_update_address'] ?: 0; return $this->success('success', $orders); } /** * @name: * @msg: 订单详情 * @param {*} * @return {*} */ public function actionDetail() { try { if (!\Yii::$app->request->isGet) { return $this->error('请求方式错误'); } $order_id = \Yii::$app->request->get('order_id'); if (empty($order_id)) return $this->error('参数错误'); $order = CloudStockAgentOrder::find() ->select('id,mall_id,user_id,num,address,express_code,express_no,goods_id,mobile,name,created_at,send_status') ->where(['mall_id' => $this->mall_id, 'user_id' => $this->user_id, 'status' => StatusEnum::ENABLED, 'id' => $order_id]) ->with([ 'details' => function ($query) { $query ->where(['status' => StatusEnum::ENABLED]) ->select('goods_id, num, order_id') ->with([ 'goods' => function ($query) { $query->select('id, goods_name, cover_pic'); } ]); } ]) ->asArray() ->one(); if (empty($order)) return $this->error('订单不存在'); $send_status_map = CloudStockEnum::getAgentOrdetStatusMap(); $traces = CloudStockAgentOrder::viewLogistics($order_id,$this->mall_id); $order['traces'] = $traces; $order['express_name'] = ''; $express = Express::findOne(['code'=>$order['express_code'],'status'=>StatusEnum::ENABLED]); $order['express_name'] = $express ? $express['name'] : ''; return $this->success('success', ['order' => $order, 'send_status_map' => $send_status_map]); }catch (\Exception $e){ return $this->error($e->getMessage()); } } /** * @name: * @msg: 确认收货 * @param {integer} order_id 订单id * @return {*} */ public function actionConfirm() { if (!\Yii::$app->request->isPost) { return $this->error('请求方式错误'); } $order_id = \Yii::$app->request->post('order_id'); if (empty($order_id)) return $this->error('参数错误'); $agent_order = CloudStockAgentOrder::findOne([ 'id' => $order_id, 'mall_id' => $this->mall_id, 'user_id' => $this->user_id, 'status' => StatusEnum::ENABLED, 'send_status' => CloudStockEnum::PICK_ORDER_STATUS1, ]); if (empty($agent_order)) return $this->error('订单不存在或者未发货'); $params = [ 'id' => $order_id, 'send_status' => CloudStockEnum::PICK_ORDER_STATUS2, ]; $res = CloudStockAgentOrder::setData($this->mall_id, $params); if (false === $res) return $this->error(CloudStockAgentOrder::getStaticError()); // 自提订单确认收货事件 $event = new FillOrderConfirmEvent($this->mall_id); $data = ['id' => $order_id]; \Yii::$app->services->events->dispatch($event, $data, $event->listeners); return $this->success('操作成功'); } /** * @name: * @msg: 创建订单 * @param {integer} goods_id:商品 id * @param {integer} number:补货数量 * @param {float} pay_money:支付金额 * @param {string} pay_type:支付方式 * @param {string} transaction_password:交易密码 * @return {*} */ public function actionCreate() { if (!\Yii::$app->request->isPost) { return $this->error('请求方式错误'); } $post = \Yii::$app->request->post(); $rules = [ [['goods_id', 'number', 'pay_money'], 'required'], [['goods_id', 'number'], 'integer'], ['pay_money', 'number'], ]; $res = \Yii::$app->services->validate->validate($post, $rules); if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage()); // 当前会员是否可以补货当前商品 $rr = CloudStockGoods::canFillGood($this->mall_id, $post['goods_id'], $this->stock_agent->level, $this->user_id); if (false === $rr) { return $this->error('暂不能补货当前商品'); } $agent_level = $this->stock_agent->level; $level_model = CloudStockLevel::findOne(['mall_id'=>$this->mall_id,'level'=>$agent_level,'status'=>StatusEnum::ENABLED]); if(!empty($level_model['is_open_fill_min'])&&!empty($level_model['fill_min'])&&$post['number']<$level_model['fill_min']){ return $this->error('每次补货的最低数量为'.$level_model['fill_min']); } $all_stocks = CloudStockGoods::allPerantAgentGoodStocks($post['goods_id'], $this->user_id, $this->mall_id); if (false === $all_stocks) { return $this->error(CloudStockGoods::getStaticError()); } elseif ($post['number'] > $all_stocks) { return $this->error('补货数量超过了商品库存'); } $stock_good = CloudStockGoods::findOne(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED, 'goods_id' => $post['goods_id']]); if (empty($stock_good)) return $this->error('商品数据异常'); if( !empty($stock_good['min_replenish']) && $post['number'] < $stock_good['min_replenish'] ) { return $this->error('最低补货数量:'.$stock_good['min_replenish']); } if(!empty($stock_good['restrict_permissions'])){ $restrict_permissions = json_decode($stock_good['restrict_permissions'],true); if(!empty($restrict_permissions)){ $cloud_stock_agent = CloudStockAgent::find()->where(['user_id'=>$this->user_id,'status'=>StatusEnum::ENABLED,'mall_id'=>$this->mall_id])->one(); if(in_array($cloud_stock_agent['level'],$restrict_permissions)){ return $this->error('您当前等级禁止购买此商品'); } } } try { RestrictPurchases::check($this->mall_id,$this->user_id,[$post['goods_id']],$post['number']); }catch (\Exception $e){ return $this->error($e->getMessage()); } $agent_price = json_decode($stock_good['agent_price'],true); $agent_price = array_column($agent_price,null,'level'); $unit_price = 0; if(!empty($agent_price[$this->stock_agent->level])){ $unit_price = $agent_price[$this->stock_agent->level]['price']; if(!empty($stock_good['is_take_by_range'])){ foreach($agent_price[$this->stock_agent->level]['price_list'] as $item){ if($item['start_num'] <= $post['number'] && $post['number'] <= $item['end_num']){ $unit_price = $item['price']; } } } } $pay_money = bcmul($unit_price, $post['number'], 2); if ($pay_money != $post['pay_money']) return $this->error('支付金额错误'); $order_no = StringHelper::generateOrderNo('CSF'); //生成支付流水 $order_trade_info[] = [ 'order_no' => $order_no, 'amount' => $pay_money, 'title' => '云库存补货订单', 'notify_class' => PayNotify::class, 'order_type' => AddonsEnum::ADDONS_NAME_CLOUD_STOCK, ]; $res_trade = \Yii::$app->services->pay->createTrade($this->mall_id, $this->user_id, $order_trade_info); if ($res_trade == false) return $this->error('生成支付流水失败'); $params = [ 'user_id' => $this->user_id, 'trade_id' => $res_trade['trade_id'], 'pay_money' => $pay_money, 'order_no' => $order_no, 'trade_no' => $res_trade['trade_no'], 'is_pay' => CloudStockEnum::FILL_STATUS_NOT_PAY, 'goods_id' => $post['goods_id'], 'num' => $post['number'], ]; $res_fill_order = CloudStockFillOrder::setData($this->mall_id, $params); if (false === $res) return $this->error(CloudStockFillOrder::getStaticError()); // 获取设置 $configs = \Yii::$app->services->setting->addons->get($this->mall_id, AddonsEnum::ADDONS_NAME_CLOUD_STOCK, 'basic'); $is_enable_rand_fee = $configs['is_enable_rand_fee'] ?? 0; return $this->success('订单创建成功', ['trade_no' => $res_trade['trade_no'], 'trade_id' => $res_trade['trade_id'], 'order_ids' => $res_fill_order->id,'is_enable_rand_fee'=>$is_enable_rand_fee]); } /** * @name: * @msg: 取消自提订单 */ public function actionCancelAgentOrder() { if (!\Yii::$app->request->isPost) { return $this->error('请求方式错误'); } $post = \Yii::$app->request->post(); $rules = [ [['id'], 'required'], [['id'], 'integer'], ]; $res = \Yii::$app->services->validate->validate($post, $rules); if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage()); $order = CloudStockAgentOrder::findOne($post['id']); if (empty($order)) { return $this->error('自提订单异常'); } if($order->send_status != CloudStockEnum::PICK_ORDER_STATUS3){ return $this->error('自提订单状态异常'); } $details = CloudStockAgentOrderDetails::find() ->where(['status' => StatusEnum::ENABLED, 'order_id' => $order->id, 'mall_id' => $order->mall_id]) ->select('num, goods_id') ->asArray() ->all(); if (empty($details)) { return $this->error('自提订单异常'); } $t = \Yii::$app->db->beginTransaction(); try{ foreach ($details as $detail) { $params_add = [ 'goods_id' => $detail['goods_id'], 'changes_dir' => CloudStockEnum::STOCK_CHANGE_ADD, 'user_id' => $order['user_id'], 'order_id' => $order['id'], 'order_type' => 0, 'changes_type' => CloudStockEnum::CHANGE_TYPE_PICKOFFLINE_RETURN, 'num' => $detail['num'], 'status' => StatusEnum::ENABLED, ]; $res_save_log = CloudStockGoodsStockLog::setData($this->mall_id, $params_add); if (false === $res_save_log) { throw new \Exception(CloudStockGoodsStockLog::getStaticError()); } $add_params = [ 'user_id' => $order['user_id'], 'num' => $detail['num'], 'mall_id'=>$this->mall_id, 'goods_id' => $detail['goods_id'], 'order_id' => $order['id'], 'order_type' => 0, 'changes_type' => CloudStockEnum::CHANGE_TYPE_PICKOFFLINE_RETURN, 'stock_log_id' => $res_save_log->id, 'status' => StatusEnum::ENABLED, ]; $res_add = CloudStockIncreaseDetail::setData($add_params); if (false === $res_add) { throw new \Exception(CloudStockIncreaseDetail::getStaticError()); } $cloud_stock_agent_goods_model = CloudStockAgentGoods::findOne(['mall_id' => $order['mall_id'], 'user_id' => $order['user_id'], 'goods_id' => $detail['goods_id'], 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]]); if (!empty($cloud_stock_agent_goods_model)) { $cloud_stock_agent_goods_model->num += $detail['num']; $res = $cloud_stock_agent_goods_model->save(); if ($res == false) throw new \Exception($cloud_stock_agent_goods_model->getErrorMessage()); } $cloud_stock_agent_model = CloudStockAgent::findOne(['mall_id' => $order['mall_id'], 'user_id' => $order['user_id'], 'status' => StatusEnum::ENABLED]); if (!empty($cloud_stock_agent_model)) { $cloud_stock_agent_model->stock += $detail['num']; $res = $cloud_stock_agent_model->save(); if ($res == false) throw new \Exception($cloud_stock_agent_model->getErrorMessage()); } $order->send_status = CloudStockEnum::PICK_ORDER_STATUS4; if (!$order->save()){ throw new \Exception($order->getErrorMessage()); } } $t->commit(); return $this->success('取消成功'); }catch(\Exception $e){ $t->rollBack(); return $this->error($e->getMessage()); } } /** * @name: * @msg: 订单支付成功页面 */ public function actionPaySuccess(){ if (!\Yii::$app->request->isGet) { return $this->error('请求方式错误'); } $params = \Yii::$app->request->get(); $rules = [ [['trade_id'], 'required'], [['trade_id'], 'integer'], ]; $res = \Yii::$app->services->validate->validate($params, $rules); if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage()); // 获取设置 $configs = \Yii::$app->services->setting->addons->get($this->mall_id, AddonsEnum::ADDONS_NAME_CLOUD_STOCK, 'basic'); $detail['is_enable_rand_fee'] = $configs['is_enable_rand_fee'] ?? 0; $order = CloudStockFillOrder::find() ->select('order_no,created_at,num,pay_money as order_money,goods_id') ->where(['trade_id'=>$params['trade_id']]) ->asArray() ->one(); if(empty($order)) return $detail; $payment = PaymentTrade::find() ->select('is_pay,pay_time,pay_fee,rand_fee') ->where(['id'=>$params['trade_id']]) ->asArray() ->one(); $goods = Goods::find() ->select('cover_pic,goods_name,price') ->where(['id'=>$order['goods_id']]) ->asArray() ->one(); $detail = array_merge($detail,$order,$payment,$goods); $detail['created_at'] = date("Y-m-d H:i:s",$detail['created_at']); $detail['pay_time'] = date("Y-m-d H:i:s",$detail['pay_time']); return $this->success('请求成功',$detail); } /** * 批量补货预览 * * @return void */ public function actionBatchFillPreview() { $baseParams = ['user_id' => $this->user_id, 'mall_id' => $this->mall_id, 'stock_agent' => $this->stock_agent]; $fillOrderService = new CloudStockFillOrderService($baseParams); $cartList = (new CloudStockFillCartService($baseParams))->getCartList(); if (empty($cartList)) { $this->error('购物车商品为空'); return; } $this->success('success', $fillOrderService->preview($cartList)); } /** * 批量补货 * * @return void */ public function actionBatchFill() { $baseParams = ['user_id' => $this->user_id, 'mall_id' => $this->mall_id, 'stock_agent' => $this->stock_agent]; $cartList = (new CloudStockFillCartService($baseParams))->getCartList(); if (empty($cartList)) { $this->error('购物车商品为空'); return; } try { $fillOrderService = new CloudStockFillOrderService($baseParams); $this->success('success', $fillOrderService->batchFill($cartList)); }catch (\Exception $e) { $this->error($e->getMessage()); } } /** * 批量下单订单详情 * * @return array|mixed|void|null */ public function actionGetBatchFillOrderDetails() { $batchOrderId = \Yii::$app->request->get('batch_order_id', 0); if (empty($batchOrderId)) { $this->error('参数错误'); return; } $fillOrderService = new CloudStockFillOrderService(['mall_id' => $this->mall_id, 'user_id' => $this->user_id]); $this->success('success', $fillOrderService->getBatchFillOrderDetails($batchOrderId)); } /** * 修改备注 * * @return void */ public function actionEditRemark() { $params = \Yii::$app->request->post(); $rules = [ [['id', 'remark'], 'required'], [['id'], 'integer'], [['remark'], 'string', 'max' => 255], ]; $res = \Yii::$app->services->validate->validate($params, $rules); if ($res === false) { return $this->error(\Yii::$app->services->validate->getErrorMessage()); } $service = new CloudStockAgentOrderService(['mall_id' => $this->mall_id]); if ( !$service->modifyRemark( $params['id'], $params['remark'], false, function ($order) { if (!in_array($order['send_status'] ?? null, [CloudStockEnum::PICK_ORDER_STATUS0, CloudStockEnum::PICK_ORDER_STATUS3])) { throw new \RuntimeException('订单状态不允许修改备注'); } if ($order['user_id'] != $this->user_id) { throw new \RuntimeException('订单不存在'); } } ) ) { $this->error($service->getError()); return; } $this->success(); } /** * 修改收货地址 * * @return void */ public function actionModifyAddress() { $params = \Yii::$app->request->post(); $rules = [ [['id', 'address_id'], 'required'], [['id', 'address_id'], 'integer'], ]; $res = \Yii::$app->services->validate->validate($params, $rules); if ($res === false) { return $this->error(\Yii::$app->services->validate->getErrorMessage()); } $service = new CloudStockAgentOrderService(['mall_id' => $this->mall_id, 'user_id' => $this->user_id]); if (!$service->modifyAddress(['id' => $params['id'], 'address_id' => $params['address_id']])) { $this->error($service->getError()); return; } $this->success(); } /** * 订单详情 * * @return void */ public function actionGetOrderDetail() { $params = \Yii::$app->request->get(); $rules = [ [['id'], 'required'], [['id'], 'integer'], ]; $res = \Yii::$app->services->validate->validate($params, $rules); if ($res === false) { $this->error(\Yii::$app->services->validate->getErrorMessage()); return; } $service = new CloudStockAgentOrderService(['mall_id' => $this->mall_id, 'user_id' => $this->user_id]); $this->success('success', $service->getOrderDetail($params['id'])); } }