-1], [['dateStart', 'dateEnd'], 'trim'], [['export', 'activity_type'], 'safe'], [['mch', 'mch_id'], 'safe'], [['fields'],'safe'] ]; } public function search($params = []) { if (!$this->validate()) { return [ 'code' => 1, 'msg' => $this->getErrorSummary(false)[0], ]; } $query = OrderRefund::find()->alias('or') ->leftJoin(['o' => Order::tableName()], 'o.id=or.order_id') ->leftJoin(['od' => OrderDetail::tableName()], 'od.order_id=o.id') ->leftJoin(['u' => User::tableName()], 'u.id=or.user_id') ->where(['or.is_delete' => Order::IS_DELETE_FALSE, 'o.is_show' => Order::IS_SHOW_TRUE]); if($this->activity_type == Order::ACTIVITY_TYPE_CUT_PRICE){ $query->andWhere(['>', 'o.activity_cut_price_order_id', 0]); } if ($this->status == OrderRefund::STATUS_IN) { $query->andWhere(['AND', ['or.status' => OrderRefund::STATUS_IN], ['or.is_user_cancel' => 0]]); } if ($this->status == self::IS_HANDLE_STATUS) { $query->andWhere(['OR', ['in', 'or.status', OrderRefund::$is_handle_status], ['or.is_user_cancel' => 1]]); } if ($this->goods_name) { $query->andWhere(['LIKE', 'od.goods_name', $this->goods_name]); } if (get_md_id()) { $query->andWhere(['or.md_id' => get_md_id()]); } $admin = get_admin(); $admin_id = $admin->id; if ($admin->username == 'admin') { $admin_id = null; } if ($admin_id) { if ($this->store_id < 0) { $salesman_id = $this->salesman_id; $salesman_where = [ 'admin_id' => $admin_id, 'is_delete' => 0 ]; if ($salesman_id) { $salesman_where['id'] = $salesman_id; } $ids = Salesman::find()->where($salesman_where)->select('id')->asArray()->all(); // $ids = Salesman::find()->where(['admin_id' => $admin_id, 'is_delete' => 0])->select('id')->asArray()->all(); $admin_model = Admin::findOne($admin_id); $area_level = $admin_model->area_level; $store_query = Store::find()->where(['is_delete' => 0]); if ($this->salesman_id) { $store_query->andWhere(['in', 'salesman_id', array_column($ids, 'id')]); } else { if($area_level == 1){ $store_query->andWhere([ 'or', ['province_id' => $admin_model->province_id, 'city_id' => $admin_model->city_id, 'district_id' => $admin_model->district_id], ['admin_id' => $admin_id], ['in', 'salesman_id', array_column($ids, 'id')] ]); } elseif ($area_level == 2){ $store_query->andWhere([ 'or', ['province_id' => $admin_model->province_id, 'city_id' => $admin_model->city_id], ['admin_id' => $admin_id], ['in', 'salesman_id', array_column($ids, 'id')] ]); } elseif ($area_level == 3){ $store_query->andWhere([ 'or', ['province_id' => $admin_model->province_id], ['admin_id' => $admin_id], ['in', 'salesman_id', array_column($ids, 'id')] ]); } else { $store_query->andWhere([ 'or', ['admin_id' => $admin_id], ['in', 'salesman_id', array_column($ids, 'id')] ]); } } $ids = $store_query->select('id')->column(); } } if (!empty($ids)) { $query->andWhere(['or.store_id' => $ids]); } else { $query->andWhere([ 'or.store_id' => $this->store_id ]); } if (!empty($params['order_no'])) { $query->andWhere(['like', 'o.order_no', $params['order_no']]); } $query->groupBy("or.order_detail_id, or.is_user_cancel"); $commonOrderSearch = new CommonOrderSearch(); // $query = $commonOrderSearch->search($query, $this); $query = $commonOrderSearch->keyword($query, $this->keywordType, $this->keyword); if ($this->flag == Export::EXPORT) { $query_export = clone $query; $list_ex = $query_export->orderBy('or.created_at DESC')->select('or.id order_refund_id,o.id order_id, o.order_no,o.name,o.mobile,o.address,u.nickname,or.order_refund_no, u.id user_id,or.created_at, or.type refund_type,or.status refund_status,or.desc refund_desc,or.pic_list refund_pic_list, or.refund_price,or.refuse_desc refund_refuse_desc,g.attr goods_attr')->asArray()->all(); // g.name goods_name,g.id goods_id,od.total_price,g.attr goods_attr,od.num,od.attr,od.total_price foreach ($list_ex as $i => $new) { $order_detail = OrderDetail::findOne($new['order_id']); $list_ex[$i]['goods_name'] = $order_detail->goods_name; $list_ex[$i]['goods_id'] = $order_detail->goods_id; $list_ex[$i]['num'] = $order_detail->num; $list_ex[$i]['total_price'] = $order_detail->total_price; $list_ex[$i]['attr'] = $order_detail->attr; } $f = new ExportList(); $f->fields = $this->fields; $f->refundForm($list_ex); } $query->orderBy('or.id DESC')->select('or.is_user_cancel, or.order_detail_id, or.id order_refund_id, o.id order_id, o.order_no, o.name, o.mch_id,,or.order_refund_no, o.mobile, o.address, o.pay_type, u.nickname, u.id user_id, u.platform, or.created_at, or.type refund_type, or.status refund_status, or.desc refund_desc, or.pic_list refund_pic_list, or.refund_price, or.refuse_desc refund_refuse_desc, or.is_agree, or.is_user_send, or.user_send_express, or.user_send_express_no, or.op_admin_name, o.md_id'); // g.name goods_name,g.id goods_id,od.num,od.attr,od.total_price if (isset($this->mch) && $this->mch == 1) { if ($this->mch_id > 0) { $query->andWhere(['o.mch_id' => $this->mch_id]); }else{ $query->andWhere(['>', 'o.mch_id', 0]); } }else{ $query->andWhere(['o.mch_id' => 0]); } $pagination = pagination_make($query); $list = $pagination['list']; foreach ($list as $i => $item) { $cancel_order_id = OrderGoodsCancel::getCancelGoodsOrderQuery($item['order_id'], 'order_detail_id', null) ->select('order_detail_id')->column(); $order_detail = OrderDetail::find()->alias('od')->leftJoin(['g' => Goods::tableName()], 'g.id=od.goods_id')->where(['od.order_id' => $item['order_id'], 'od.is_refund' => 1]) ->andWhere(['in', 'od.id', Json::decode($item['order_detail_id'])])->andWhere(['NOT IN', 'od.id', $cancel_order_id]) ->select('od.goods_name as name, od.delivery_type, od.total_price, od.num, od.attr, g.attr as attr_list, od.pic, g.cover_pic as goods_pic')->asArray()->all(); $list[$i]['goods_list'] = $order_detail; $list[$i]['created_at'] = date('Y-m-d H:i:s', $item['created_at']); $list[$i]['refund_pic_list'] = json_decode($item['refund_pic_list']); $item['md_info'] = null; if ($list[$i]['md_id']) { $list[$i]['md_info'] = Md::findOne($item['md_id']); } $rmSum = \app\models\OrderRefundMoney::find()->where(['is_delete' => 0, 'status' => 1, 'order_id' => $item['order_id']])->sum('refund_price'); $rmSum && $list[$i]['refund_price_text'] = $item['refund_price'].' / 已退' . $rmSum; $list[$i]['has_refund_price'] += $rmSum; $list[$i]['can_refund_price'] = $rmSum < $list[$i]['refund_price']; //商家点击同意申请售后调用云仓申请售后接口 //以下为调用云仓申请售后接口所用参数 $reasonsType = null; $returnType = null; $packageType = null; $serviceType = null; $orderTransit = OrderTransit::findOne(['order_id' => $item['order_id'], 'is_delete' => 0]); $list[$i]['cloud_cancel_examine'] = 1;//如果是已经申请售后则商城不显示退款退货按钮 if ($orderTransit) { if (intval($orderTransit->cancel_examine) === 0) { $form = new MerchantForm(); $token = get_merchant_token(); $result = $form->stbzRrfundOrderHandleInfo($token, $orderTransit->cloud_order_id); if ($result['code'] === 0) { $reasonsType = $result['data']['reasonsType']; $returnType = $result['data']['returnType']; $packageType = $result['data']['packageType']; $serviceType = $result['data']['serviceType']; } } else { $cancel_examine_info = json_decode($orderTransit->cancel_examine_info, true) ?? []; $transit_order_detail_id = array_column($cancel_examine_info, 'store_order_detail_id'); $list[$i]['cloud_cancel_examine'] = 0; $open = false; $order_detail_id = json_decode($item['order_detail_id'], true); foreach ($transit_order_detail_id as $transit_detail_item) { foreach ($order_detail_id as $detail_item) { if ($transit_detail_item == $detail_item) { $open = true; } } } if (!$open) { $list[$i]['cloud_cancel_examine'] = 1; } } } $list[$i]['cloud_order_price'] = $item['refund_price'] ?? 0; $list[$i]['reasonsType'] = $reasonsType; $list[$i]['returnType'] = $returnType; $list[$i]['packageType'] = $packageType; $list[$i]['serviceType'] = $serviceType; $list[$i]['is_tran'] = !empty($orderTransit) ? 1 : 0; $list[$i]['cloud_order_id'] = $orderTransit->cloud_order_id ?? 0; $list[$i]['order_refund_no'] = $item['order_refund_no']; $orderRefund = OrderRefund::find()->where(['id' => $item['order_refund_id']])->asArray()->one(); $list[$i]['refund_status_desc'] = OrderRefund::getTypeText($orderRefund); } $address = RefundAddress::find()->where(['store_id' => $this->store_id, 'mch_id' => 0, 'is_delete' => 0])->all(); if ($this->mch_id > 0) { $address = RefundAddress::find()->where(['mch_id' => $this->mch_id, 'is_delete' => 0])->all(); } foreach ($address as &$v) { if (mb_strlen($v->address) > 20) { $v->address = mb_substr($v->address, 0, 20) . '···'; } } unset($v); // 获取可导出数据 $f = new ExportList(); $f->type = 1; $exportList = $f->getList(); if($this->export){ return $this->export($list); } return [ 'code' => 0, 'msg' => 'success', 'data' => [ 'q' => $query->createCommand()->getRawSql(), 'export_list' => $exportList, 'data' => $list, 'address' => $address, 'pageNo' => $pagination['pageNo'], 'totalCount' => $pagination['totalCount'], ], ]; } private function export($list) { $rows = [[ '会员信息', '订单号', '售后单号', '售后类型', '退款金额(元)', '商品', '买家/收货人', '买家/收货人手机号', '下单门店', '时间', ]]; foreach($list as $item){ $refund_type = '换货'; if($item['refund_type'] == 1){ $refund_type = '退款退货'; } $goods = []; foreach ($item['goods_list'] as $i => $gitem) { $attr = []; $gitem['attr_list'] = json_decode($gitem['attr_list'], true); foreach ($gitem['attr_list'] as $atitem) { $attr[] = isset($atitem['attr_name']) ? $atitem['attr_name'] : ''; } $goods[] = $gitem['name'] . '(' . implode(',', $attr) . ')' . '(' . $gitem['num'] . $gitem['unit'] . ')' . '(' . $gitem['total_price'] . '元)'; } $r = [ $item['nickname'], $item['order_no'], $item['order_refund_no'], $refund_type, $item['refund_price'], '【' . implode('】,【', $goods) . '】', $item['name'], $item['mobile'], isset($item['md_info']) ? $item['md_info']['name'] : '', $item['created_at'], ]; $rows[] = $r; } $writer = \Spatie\SimpleExcel\SimpleExcelWriter::streamDownload(time() . '.xlsx')->noHeaderRow() ->addRows($rows)->toBrowser(); } }