1], [['limit'], 'default', 'value' => 20], [['order_no'], 'default', 'value' => 0], // [['order_id', 'key'],'trim'], [['nowlongitude', 'nowlatitude', 'status', 'cloud_order_id', 'order_id'], 'safe'], ]; } public function search() { if (!$this->validate()) { return [ 'code' => 1, 'msg' => $this->getErrorSummary(false)[0], ]; } $this->saas_id = get_saas_user_id(); $query = PurchaseOrder::find()->where([ 'is_delete' => 0, 'store_id' => $this->store_id, //'saas_id' => $this->saas_id, 'user_delete' => 0 ]); if ($this->order_id) {//待付款 $query->andWhere([ 'id' => $this->order_id, ]); } if ($this->cloud_order_id) { $query->andWhere([ 'cloud_order_id' => $this->cloud_order_id, ]); } if (isset($this->status) && $this->status > -1) { $query->andWhere([ '<>', 'trade_status', PurchaseOrder::ORDER_FLOW_CANCEL ]); } if ($this->status === 0) {//待付款 $query->andWhere([ 'is_pay' => PurchaseOrder::IS_PAY_FALSE, ]); } if ($this->status == 1) {//待发货 $query->andWhere([ 'or', ['trade_status' => PurchaseOrder::ORDER_FLOW_NO_SEND], ['pay_type' => 2, 'trade_status' => PurchaseOrder::ORDER_FLOW_DEFAULT] ])->andWhere(['or', ['is_pay' => 1], ['pay_type' => 2]]); } if ($this->status == 2) {//待收货 $query->andWhere([ 'trade_status' => PurchaseOrder::ORDER_FLOW_SEND, ]); } if ($this->status == 3) {//已完成 $query->andWhere([ 'trade_status' => PurchaseOrder::ORDER_FLOW_CONFIRM, ]); } if ($this->status == 4) {//售后订单 // return $this->getRefundList(); } $query->andWhere(['is_recycle' => 0]); $count = $query->count(); $pagination = new Pagination(['totalCount' => $count, 'page' => $this->page - 1, 'pageSize' => $this->limit]); /* @var Order[] $list */ $list = $query->limit($pagination->limit)->offset($pagination->offset)->orderBy('created_at DESC')->all(); $new_list = []; $sgoods = []; foreach ($list as $order) { $is_can_confirm = true; // 预约订单超过15分钟未支付自动取消 if (time() - $order->created_at > 15 * 60 && $order->trade_status != PurchaseOrder::ORDER_FLOW_CANCEL && $order->is_pay == 0 && $order->pay_type != 2) { $order->trade_status = PurchaseOrder::ORDER_FLOW_CANCEL; $order->updated_at = time(); $order->save(); // SaasCoupon::updateAll(['is_use' => 0], ['id' => $order->user_coupon_id]); } $goods_list = PurchaseOrderDetail::find()->where(['order_id' => $order->id, 'is_delete' => 0])->asArray()->all(); $give_goods_list = []; foreach ($goods_list as $index => &$order_detail) { $order_detail['is_give'] = (int)$order_detail['is_give']; if(!isset($sgoods[$order_detail['goods_id']])){ $form = new PlatformForm(); $form->id = $order_detail['goods_id']; $glist = $form->goodsInfo(); $goods = ''; if($glist['code'] == 0 && $glist['data']['count'] == 1){ $goods = $glist['data']['list'][0]; } $sgoods[$order_detail['goods_id']] = $goods; } if ($order_detail['is_give'] === 1) { $give_goods_list[] = $order_detail; unset($goods_list[$index]); continue; } $order_detail['goods'] = $goods; //是否需要上门安装 $install_log = AgentGoodsInstallLog::findOne(['order_detail_id' => $order_detail['id'], 'order_type' => AgentGoodsInstallLog::ORDER_TYPE_PURCHASE]); $order_detail['goods_install'] = 0; if ($install_log->is_need_install && (int)$install_log->status >= 1) { $order_detail['goods_install'] = (int)$install_log->status; } //判断是否可点击确认收货 $is_can_confirm_sub = ((bool)AgentGoodsInstallLog::findOne(['order_detail_id' => $order_detail['id'], 'status' => [0, 1], 'is_need_install' => 1, 'order_type' => AgentGoodsInstallLog::ORDER_TYPE_PURCHASE])); if ($is_can_confirm_sub) { $is_can_confirm = false; } } if ($order->trade_status == PurchaseOrder::ORDER_FLOW_SEND && !$is_can_confirm || intval($order->trade_status) !== PurchaseOrder::ORDER_FLOW_SEND) { $is_can_confirm = false; } $goods_list = array_values($goods_list); $give_goods_list = array_values($give_goods_list); $qrcode = null; $mch = $goods['supplier'] ?? []; // $orderRefund = OrderRefund::find()->where(['store_id' => $order->store_id, 'order_id' => $order->id])->exists(); // $deliveryInfo = null; // if ($order->is_delivery == 1) { // $deliveryInfo = DeliveryInfo::find()->where(['order_no' => $order->order_no])->one(); // } $is_order_refund = $order_refund_enable = 0; // if ($orderRefund) { // $is_order_refund = 1; // } else { // $is_order_refund = 0; // } if ($order->is_pay == 1 && ($order->trade_status == PurchaseOrder::ORDER_FLOW_SEND || $order->trade_status == PurchaseOrder::ORDER_FLOW_CONFIRM)) { $order_refund_enable = 1; } else { $order_refund_enable = 0; } if ($order->trade_status == PurchaseOrder::ORDER_FLOW_CONFIRM) { $after_sale_time = Option::get(OptionSetting::STORE_AFTER_SALE_TIME, $this->store_id); if ((time() - $order->confirm_time) > $after_sale_time['value'] * 86400) {//超过可售后时间 $order_refund_enable = 0; } } $supplier = Supplier::findOne($order->supplier_id); $sale_day = ($supplier->sale_day * (60 * 60 * 24)); $is_sale = 0; if (($sale_day + $order->confirm_time) > time()) { $is_sale = 1; } $storeInfo = Store::find()->where(['id' => $order->store_id])->asArray()->one(); $res = $this->getCloudOrderNo($order->cloud_order_id); $cloud_order_no = ''; if ($res['code'] === 0 && isset($res['data']['order'])) { $cloud_order_no = $res['data']['order']['order_no']; } $item = get_saas_purchase_store_cloud(); $cloud_store_id = $item ? $item->id : 0; $token = get_merchant_token($cloud_store_id, 0, $message); $result = $this->stbzRrfundOrderHandle($token, $order->cloud_order_id); $reasonsType = null; $returnType = null; $packageType = null; if ($result['code'] === 0) { $reasonsType = $result['data']['reasonsType']; $returnType = $result['data']['returnType']; $packageType = $result['data']['packageType']; } $new_list[] = (object)[ 'id' => $order->cloud_order_id, 'is_order_refund' => $is_order_refund, 'order_refund_enable' => $order_refund_enable, 'order_id' => $order->id, 'order_no' => $order->order_no, 'cloud_order_no' => $cloud_order_no, 'add_time' => $order->created_at, 'goods_list' => $goods_list, 'express_price' => $order->express_price, 'total_price' => $order->total_price, 'pay_price' => $deliveryInfo ? sprintf("%1.2f", $order->pay_price + $deliveryInfo->fee) : $order->pay_price, 'is_pay' => $order->is_pay, 'is_comment' => $order->is_comment, 'is_offline' => $order->is_offline, 'qrcode' => $qrcode, 'offline_qrcode' => $order->offline_qrcode, 'express' => $order->express, 'address' => $order->address, 'mobile' => $order->mobile, 'name' => $order->name, 'mch' => $mch, 'type' => $order->type, 'pay_type' => $order->pay_type, 'refund' => $orderRefund, 'apply_delete' => $order->apply_delete, 'trade_status' => $order->trade_status, 'delivery_fee' => $deliveryInfo ? $deliveryInfo->fee : 0, 'is_delivery' => $order->is_delivery, 'order_type' => $order->order_type, 'store_id' => $storeInfo['id'], 'store_name' => $storeInfo['name'], 'store_logo' => $storeInfo['logo'], 'cancel_examine' => $order->trade_status < 3 ? null : ($is_sale ? $order->cancel_examine : null), 'cancel_examine_time' => date("Y-m-d H:i:s", $order->cancel_examine_time), 'reasonsType' => $reasonsType, 'returnType' => $returnType, 'packageType' => $packageType, 'centralized_status' => (int)$order->centralized_status, 'give_goods_list' => $give_goods_list, 'is_can_confirm' => $is_can_confirm ]; } // $pay_type_list = OrderForm::getPayType(); return [ 'code' => 0, 'msg' => 'success', 'data' => [ 'row_count' => $count, 'page_count' => $pagination->pageCount, 'list' => $new_list, // 'pay_type_list' => $pay_type_list, 'revoke_tpl'=>'', 'template_id' => NoticeAction::getSendTamplateId(['order_cancel']), ], ]; } public function stbzRrfundOrderHandle($cloud_store_token, $id, $type = 0) { try { $order_url = "/cloud/mch/mchOrderList"; $order_data['access_token'] = $cloud_store_token; $order_data['id'] = $id; $order_data['type'] = $type; $domain = (new OptionSetting)->getCloudDomainName(); $orderInfo = cloud_post($domain. $order_url, $order_data); debug_log($order_data); debug_log($orderInfo); $orderInfo = json_decode($orderInfo,true); if ($orderInfo['code'] !== 0) { return [ 'code' => 0, 'msg' => $orderInfo['msg'] ]; } $data = $orderInfo['data']['list'][0]; if (!empty($data['goods_list'])) { foreach ($data['goods_list'] as $datum) { $attr = json_decode($datum['attr'], true); if ($datum['stbz_goods_id'] && $attr['no']) { $params = [ 'orderSn' => $data['order_no'], 'sku' => $attr['no'] ]; $checkData = \stbz_client()->getApiResponse('post', '/v2/afterSale/beforeCheck', $params); debug_log($checkData); $checkData = \json_decode($checkData, true); if ($checkData['code'] === 1) { $checkData = $checkData['data']; $num = $checkData['num']; $reasonsType = $checkData['reasonsType']; $returnType = $checkData['returnType']; $packageType = $checkData['packageType']; return [ 'code' => 0, 'msg' => 'success', 'data' => [ 'reasonsType' => $reasonsType, 'returnType' => $returnType, 'packageType' => $packageType ] ]; } else { return [ 'code' => 1, 'msg' => $checkData['msg'] ]; } } } } return [ 'code' => 0, 'data' => [ 'reasonsType' => null, 'returnType' => null, 'packageType' => null ] ]; } catch (\Exception $e) { return [ 'code' => 1, 'msg' => $e->getMessage() ]; } } public static function appendOrderInfo($cloudRes) { if($cloudRes['code'] == 0 && $cloudRes['data']['count']){ foreach ($cloudRes['data']['list'] as $i => $v){ $cloudRes['data']['list'][$i]['user'] = [ 'username' => '', 'store_name' => '', ]; $order = PurchaseOrder::findOne(['cloud_order_id' => $v['id']]); if(!$order){ continue; } // $saas = \app\models\SaasUser::findOne($order['saas_id']); // $cloudRes['data']['list'][$i]['user']['username'] = $saas ? $saas['name'] : ''; $storeInfo = Store::find()->where(['id' => $order->store_id])->asArray()->one(); $cloudRes['data']['list'][$i]['user']['store_name'] = $storeInfo ? $storeInfo['name'] : ''; } } return $cloudRes; } private function getRefundList() { $query = OrderRefund::find()->alias('or') ->leftJoin(['od' => PurchaseOrderDetail::tableName()], 'od.id=or.order_detail_id') ->leftJoin(['o' => PurchaseOrder::tableName()], 'o.id=or.order_id') ->where([ 'or.store_id' => $this->store_id, 'or.user_id' => $this->user_id, 'or.is_delete' => 0, 'o.is_delete' => 0, 'od.is_delete' => 0, ]); if($this->order_id){ $query->andWhere(['o.id' => $this->order_id]); } $count = $query->count(); $pagination = new Pagination(['totalCount' => $count, 'page' => $this->page - 1, 'pageSize' => $this->limit]); $list = $query->select('o.id AS order_id,o.order_no,or.id AS order_refund_id,od.goods_id,or.created_at,od.num,od.total_price,od.attr,or.refund_price,or.type,or.status,or.is_agree,or.is_user_send,od.goods_info, od.goods_name, od.pic') ->limit($pagination->limit)->offset($pagination->offset)->orderBy('or.id DESC')->asArray()->all(); $new_list = []; foreach ($list as $item) { $goods = Json::decode($item['goods_info']) ?:Goods::find()->where(['id' => $item['goods_id']])->asArray()->one(); if (!$goods) { continue; } $new_list[] = (object)[ 'order_id' => intval($item['order_id']), 'order_no' => $item['order_no'], 'goods_list' => [(object)[ 'goods_id' => intval($goods->id), 'goods_pic' => $item['pic'] ?: $goods['cover_pic'], 'goods_name' => $item['goods_name'], 'num' => intval($item['num']), 'price' => doubleval(sprintf('%.2f', $item['total_price'])), 'attr_list' => json_decode($item['attr']), ]], 'addtime' => date('Y-m-d H:i', $item['created_at']), 'refund_price' => doubleval(sprintf('%.2f', $item['refund_price'])), 'refund_type' => $item['type'], 'refund_status' => $item['status'], 'order_refund_id' => $item['order_refund_id'], 'is_agree' => $item['is_agree'], 'is_user_send' => $item['is_user_send'], ]; } return [ 'code' => 0, 'msg' => 'success', 'data' => [ 'row_count' => $count, 'page_count' => $pagination->pageCount, 'list' => $new_list, ], ]; } public function getNewRefundList() { $after_sale_time = Option::get(OptionSetting::STORE_AFTER_SALE_TIME, $this->store_id); $new_list = []; if (!$this->status) { $query = PurchaseOrder::find()->alias('o') ->where([ //'o.store_id' => $this->store_id, 'o.saas_id' => $this->saas_id, 'o.is_delete' => 0, ]); // if (get_md_id()) { // $query->andWhere(['o.md_id' => get_md_id()]); // } $query->andWhere(['o.trade_status' => PurchaseOrder::ORDER_FLOW_CONFIRM]); //$query->andWhere(['>', 'o.confirm_time', time() - $after_sale_time['value'] * 86400]); ?? $list = $query->select('o.pay_price, o.confirm_time, o.id AS order_id,o.order_no,o.created_at')->orderBy('o.id DESC')->asArray()->all(); foreach ($list as $item) { $detail_goods = PurchaseOrderDetail::find()->where(['order_id' => $item['order_id'], 'is_refund' => 0])->asArray()->all(); if (empty($detail_goods)) { continue; } $detail_goods = PurchaseOrderDetail::find()->where(['order_id' => $item['order_id']])->asArray()->all(); $order_data = [ 'order_id' => intval($item['order_id']), 'order_no' => $item['order_no'], 'pay_price' => $item['pay_price'], 'goods_list' => [], 'addtime' => date('Y-m-d H:i', $item['created_at']), 'refund_price' => isset($item['refund_price']) ? doubleval(sprintf('%.2f', $item['refund_price'])) : 0, 'refund_type' => isset($item['type']) ? $item['type'] : 0, 'refund_status' => isset($item['status']) ? $item['status'] : 0, 'order_refund_id' => isset($item['order_refund_id']) ? $item['order_refund_id'] : 0, 'is_agree' => isset($item['is_agree']) ? $item['is_agree'] : 0, 'is_user_send' => isset($item['is_user_send']) ? $item['is_user_send'] : 0, ]; $goods_list = []; foreach ($detail_goods as $detail) { $goods_list[] = [ 'goods_id' => intval($detail['goods_id']), 'goods_pic' => $detail['pic'], 'goods_name' => $detail['goods_name'], 'num' => intval($detail['num']), 'price' => doubleval(sprintf('%.2f', $detail['total_price'])), 'attr_list' => json_decode($detail['attr']), ]; } $order_data['goods_list'] = $goods_list; $new_list[] = $order_data; } } // 处理中 或者 已完成 if ($this->status == 1 || $this->status == 2) { $query = OrderRefund::find()->alias('or') ->leftJoin(['o' => PurchaseOrder::tableName()], 'o.id=or.order_id') ->where([ //'or.store_id' => $this->store_id, 'or.user_id' => $this->saas_id, 'or.is_delete' => 0, 'o.is_delete' => 0, 'or.user_delete' => 0 ]); // if (get_md_id()) { // $query->andWhere(['or.md_id' => get_md_id()]); // } if ($this->status == 1) { $query->andWhere(['or.status' => OrderRefund::STATUS_IN, 'or.is_user_cancel' => 0]); } if ($this->status == 2) { $query->andWhere(['or', ['or.is_user_cancel' => 1], ['in', 'or.status', OrderRefund::$is_handle_status]]); } $list = $query->select('or.is_user_cancel, or.order_detail_id,o.pay_price, o.confirm_time, o.id AS order_id,o.order_no,or.id AS order_refund_id,or.created_at,or.refund_price,or.type,or.status,or.is_agree,or.is_user_send')->orderBy('or.id DESC')->asArray()->all(); if (!empty($list)) { foreach ($list as $item) { $order_data = [ 'is_user_cancel' => intval($item['is_user_cancel']), 'order_id' => intval($item['order_id']), 'order_no' => $item['order_no'], 'pay_price' => $item['pay_price'], 'goods_list' => [], 'addtime' => date('Y-m-d H:i', $item['created_at']), 'refund_price' => isset($item['refund_price']) ? doubleval(sprintf('%.2f', $item['refund_price'])) : 0, 'refund_type' => isset($item['type']) ? $item['type'] : 0, 'refund_status' => isset($item['status']) ? $item['status'] : 0, 'order_refund_id' => isset($item['order_refund_id']) ? $item['order_refund_id'] : 0, 'is_agree' => isset($item['is_agree']) ? $item['is_agree'] : 0, 'is_user_send' => isset($item['is_user_send']) ? $item['is_user_send'] : 0, ]; $detail_id = Json::decode($item['order_detail_id']); $detail_goods = PurchaseOrderDetail::find()->where(['order_id' => $item['order_id'], 'is_refund' => 1])->andWhere(['in', 'id', $detail_id])->asArray()->all(); $goods_list = []; $price = 0; foreach ($detail_goods as $detail) { $goods_list[] = [ 'goods_id' => intval($detail['goods_id']), 'goods_pic' => $detail['pic'], 'goods_name' => $detail['goods_name'], 'num' => intval($detail['num']), 'price' => doubleval(sprintf('%.2f', $detail['total_price'])), 'attr_list' => json_decode($detail['attr']), 'is_refund' => $detail['is_refund'] ]; $price += $detail['total_price']; } $order_data['pay_price'] = $price; $order_data['goods_list'] = $goods_list; $new_list[] = $order_data; } } } $data = array_slice($new_list, ($this->page - 1) * $this->limit, $this->limit); return [ 'code' => 0, 'msg' => 'success', 'data' => [ 'row_count' => count($new_list), 'page_count' => ceil(count($new_list) / $this->limit), 'list' => $data, ], ]; } public static function getCountData($saas_id) { $form = new OrderListForm(); $form->limit = 1; //$form->store_id = $store_id; $form->saas_id = $saas_id; $data = []; $form->status = -1; $res = $form->searchOrderCount(); $data['all'] = $res; $form->status = 0; $res = $form->searchOrderCount(); $data['status_0'] = $res; $form->status = 1; $res = $form->searchOrderCount(); $data['status_1'] = $res; $form->status = 2; $res = $form->searchOrderCount(); $data['status_2'] = $res; $form->status = 3; $res = $form->searchOrderCount(); $data['status_3'] = $res; return $data; } /** * 获取订单数方法 * @return array|int|string */ public function searchOrderCount() { $query = PurchaseOrder::find()->where([ 'is_delete' => 0, 'user_delete' => 0, //'store_id' => $this->store_id, 'saas_id' => $this->saas_id, ]); if (isset($this->status) && $this->status > -1) { $query->andWhere([ '<>', 'trade_status', PurchaseOrder::ORDER_FLOW_CANCEL ]); } if ($this->status == 0) {//待付款 $query->andWhere([ 'is_pay' => PurchaseOrder::IS_PAY_FALSE, ])->andWhere(['!=', 'pay_type' , 2]); } if ($this->status == 1) {//待发货 $query->andWhere([ 'trade_status' => PurchaseOrder::ORDER_FLOW_NO_SEND, ])->andWhere(['or', ['is_pay' => 1], ['pay_type' => 2]]); } if ($this->status == 2) {//待收货 $query->andWhere([ 'trade_status' => PurchaseOrder::ORDER_FLOW_SEND, ]); } if ($this->status == 3) {//已完成 $query->andWhere([ 'trade_status' => PurchaseOrder::ORDER_FLOW_CONFIRM, ]); } $query->andWhere(['is_recycle' => 0]); return $query->count(); } //更改配送单状态 public function getCloudOrderNo($order_id) { try { //获取平台token // $cloud_token = $this->getCloudToken(); $cloud_token = get_platform_token(); $getGoodsCateUrl = "/cloud/user/getOrderNo"; $getGoodsCateData['access_token'] = $cloud_token; $getGoodsCateData['order_id'] = $order_id; $domain = (new OptionSetting)->getCloudDomainName(); $getGoodsCateInfo = cloud_post($domain.$getGoodsCateUrl,$getGoodsCateData); $getGoodsCateInfo = json_decode($getGoodsCateInfo,true); if($getGoodsCateInfo['code'] != 0){ throw new \Exception($getGoodsCateInfo['msg']); } return [ 'code' => 0, 'data' => $getGoodsCateInfo['data'], 'msg' => 'success' ]; } catch (\Exception $e) { return [ 'code' => 1, 'msg' => $e->getMessage() ]; } } //获取平台token // public function getCloudToken() { // $content = \Yii::$app->cache->get('cloud_admin_cache_token'); // if ($content) { // $params = json_decode($content, true); // //3天刷新token // if(time() - $params['time'] < (3 * 24 * 3600) ){ // return $params['access_token']; // } // } // $content = Option::get('cloud', 0, 'saas'); // $params = json_decode($content['value'], true); // $response = $this->getToken($params['name'], $params['pwd']); // if ($response['code'] == 0 && $response['taken']) { // $data = []; // $data['name'] = $params['name']; // $data['pwd'] = $params['pwd']; // $data['access_token'] = $response['taken']; // $data['time'] = time(); // \Yii::$app->cache->set('cloud_admin_cache_token', Json::encode($data), 3 * 24 * 3600); // return $response['taken']; // } // return ''; // } }