| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362 |
- <?php
- /**
- * 重庆赤晓店信息科技有限公司
- * https://www.chixiaodian.com
- * Copyright (c) 2023 赤店商城 All rights reserved.
- */
- namespace app\modules\admin\models;
- use app\models\Admin;
- use app\models\common\admin\order\CommonOrderSearch;
- use app\models\Goods;
- use app\models\Md;
- use app\models\Order;
- use app\models\OrderDetail;
- use app\models\OrderGoodsCancel;
- use app\models\OrderRefund;
- use app\models\OrderTransit;
- use app\models\RefundAddress;
- use app\models\Salesman;
- use app\models\Store;
- use app\models\User;
- use app\utils\Export;
- use app\utils\ExportList;
- use yii\base\Model;
- use yii\helpers\Json;
- class OrderRefundListForm extends Model
- {
- public $export;
- public $store_id;
- public $user_id;
- public $keyword;
- public $status;
- public $dateStart;
- public $dateEnd;
- public $keywordType;
- public $platform; //所属平台
- public $flag;
- public $fields;
- public $salesman_id;
- public $activity_type;
- public $goods_name;
- public $mch;
- public $mch_id;
- // 已处理状态
- const IS_HANDLE_STATUS = 1;
- public function rules()
- {
- return [
- [['keyword', 'flag'], 'trim'],
- [['flag', 'goods_name'], 'string'],
- [['status', 'user_id', 'keywordType', 'salesman_id'], 'integer'],
- [['status'], 'default', 'value' => -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();
- }
- }
|