255], [['express', 'saler_express'], 'string', 'max' => 65], [['order_source'],'string'], [['saler_address'],'string'] ]; } /** * {@inheritdoc} */ public function attributeLabels() { return [ 'id' => 'ID', 'mall_id' => 'Mall ID', 'mch_id' => 'Mch ID', 'store_id' => '门店id', 'user_id' => '用户id', 'order_id' => '订单id', 'order_detail_id' => '关联订单详情id', 'order_no' => '售后单号', 'type' => '售后类型:1=仅退款,2=退货退款,3=换货', 'reason' => '退款原因', 'remark' => '用户退款备注、说明', 'pic_list' => '用户上传图片凭证', 'refuse_remark' => '商家拒绝理由', 'express' => '快递公司', 'express_no' => '快递单号', 'saler_express' => '商家快递公司', 'customer_name' => '京东物流', 'saler_express_no' => '商家快递单号', 'saler_address' => '买家收货地址(json存储)', 'is_refund' => '是否打款,【0否,1是】', 'refund_at' => '打款时间', 'refund_price' => '退款金额', 'reality_refund_price' => '实际退款金额', 'express_at' => '买家发货时间', 'saler_express_at' => '卖家重新发货时间', 'step_status' => '售后步骤状态', 'refund_status' => '售后状态', 'status' => '状态【1启用 0禁用 -1删除】', 'created_at' => '创建时间', 'updated_at' => '修改时间', ]; } public function getStep() { return $this->hasMany(OrderRefundStep::class, ['order_refund_id' => 'id'])->where(['status' => StatusEnum::ENABLED])->orderBy('id desc'); } public function getOrderDetail() { return $this->hasOne(OrderDetail::class, ['id' => 'order_detail_id']); } public function getBase_user() { return $this->hasOne(User::class, ['id' => 'user_id'])->select(['id', 'username','nickname', 'avatar_url','mobile']); } public function getOrder() { return $this->hasOne(Order::class, ['id' => 'order_id'])->select(['id', 'store_id', 'province', 'mch_id', 'order_no','out_trade_no','payment_type','mobile','receiver_name','region_name','address','order_status', 'marketing_type', 'order_source','extra_info','shipping_money']); } public function getMarketing() { return $this->hasOne(OrderMarketing::class, ['order_detail_id' => 'order_detail_id'])->select(['order_detail_id', 'deduct_score','deduct_currency','user_coupon_id']); } /** * 获取最新的一条售后步骤 * * @return ActiveQuery */ public function getLastStep() { return $this->hasOne(OrderRefundStep::class, ['order_refund_id' => 'id']) ->where(['status' => StatusEnum::ENABLED]) ->orderBy('id desc'); } /** * 畅捷通请求 * * @return \yii\db\ActiveQuery */ public function getAddonsChanjetRequest() { return $this ->hasOne(AddonsChanjetRequest::class, ['table_id' => 'id']) ->orderBy('updated_at desc') ->select('id, table_id, request_status, updated_at') ->where([ 'table' => self::tableName(), 'path' => [Request::PATHS['SALE_DELIVERY_CREATE_BATCH']] ]) ->andWhere(['>', 'request_status', 0]); } /** * @Author: hua * @DateTime: 2021/10/8 17:53 * @Copyright: copyright (c) 2021 广东七件事集团 * @param array $params * @return bool|OrderRefund */ public static function setData(array $params) { try { if (!empty($params['id'])) { $model = self::findOne(['mall_id' => $params['mall_id'],'user_id'=>$params['user_id'], 'id' => $params['id'], 'status' => [StatusEnum::ENABLED]]); if (empty($model)) throw new Exception('订单详情不存在或已删除'); } else { $model = new self(); $model->loadDefaultValues(); } if (isset($params['pic_list'])) $params['pic_list'] = Json::encode($params['pic_list']); if (!$model->load($params, '') || !$model->save()) { throw new Exception($model->getErrorMessage()); } return $model; } catch (Exception $e) { self::$static_error = $e->getMessage(); return false; } } /** * 根据订单号获取订单id * @Author: lun * @DateTime: 2021/10/9 0009 10:33 * @Copyright: copyright (c) 2021 广东七件事集团 * @param $mall_id * @param $order_no * @return false|int|string|null */ public static function getOidByOrderNo($mall_id, $order_no) { return Order::find()->select('id')->where(['mall_id' => $mall_id, 'order_no' => $order_no])->asArray()->scalar(); } public static function getVagueOrderNo($mall_id, $order_no) { return Order::find()->select("id")->where(['mall_id' => $mall_id])->where(['like', 'order_no' ,$order_no])->asArray()->column(); } public static function searchByKeyword($mall_id, $type, $keyword) { switch ($type) { case 'mobile': $user = User::getOne([['mall_id' => $mall_id, 'mobile' => $keyword]], true, [], false, 'id'); $data = ['=', 'user_id', $user['id']]; break; case 'goods_name': $goodsId = Goods::find()->select('id')->where(['mall_id' => $mall_id])->andWhere(['like', 'goods_name', $keyword])->asArray()->column(); if ($goodsId) { $orderDetailIds = OrderDetail::find()->select('id')->where(['mall_id' => $mall_id])->andWhere(['in', 'goods_id', $goodsId])->asArray()->column(); } $data = empty($orderDetailIds) ? ['=', 'order_detail_id',""] : ['in', 'order_detail_id', $orderDetailIds]; break; // 交易单号查询 case 'trade_no': $ids = PaymentTrade::find()->where(['mall_id' => $mall_id, 'out_trade_no' => $keyword])->select('id')->column(); $order_nos = PaymentTradeOrder::find()->where(['trade_id' => $ids])->select('order_no')->column(); $order_ids = Order::find()->where(['order_no' => $order_nos])->select('id')->column(); $data = ['order_id' => $order_ids]; break; } return $data; } /** * 申请售后 * @Author: hua * @DateTime: 2021/10/7 10:26 * @Copyright: copyright (c) 2021 广东七件事集团 * @param $params * @return object|bool */ public static function feedback($params){ $t = Yii::$app->db->beginTransaction(); try{ //订单详情表 $order_detail = OrderDetail::findOne(['id' => $params['order_detail_id'], 'user_id' => $params['user_id']]); if (empty($order_detail)) throw new Exception('订单不存在'); if (!isset($params['num'])) $params['num'] = intval($order_detail->num); if (empty($order_detail->store_id)) { $goods = Goods::findOne(['id' => $order_detail->goods_id]); if (empty($goods->can_feedback)) throw new Exception('当前商品不支持售后'); } $order = Order::findOne(['id'=>$order_detail['order_id']]); $original_goods_price = $order_detail->goods_price;// 记录此商品的原实付金额 if (!empty($goods) && $goods->goods_type == GoodsTypeEnum::GoodsTypeVirtual) { if ($order_detail->is_feedback != StatusEnum::DISABLED) { throw new Exception('订单已过售后时间,无法申请售后'); } } else { if ($order_detail->order_status == OrderStatusEnum::ACCOMPLISH) throw new Exception('订单已过售后时间,无法申请售后'); /* 自提订单 待提货是否允许退款 */ $communityGoodsSetting = GlobalInvoke::exec(GlobalInvoke::INVOKE_ORDER_DETAILS_ITEM, $order_detail->mall_id, [ 'order_detail' => ['goods_id' => $order_detail->goods_id, 'order_id' => $order_detail->order_id], 'mall_id' => $order_detail->mall_id, ]); // 不在允许退款的状态里面,或者在允许退款的状态里面,但是是社区团购自提订单并且不允许申请退款 if ( ($order->order_source == OrderSourceEnum::SOURCE_REGISTRATION && $order->order_status != OrderStatusEnum::TAKE) && (!in_array($order_detail->order_status, [OrderStatusEnum::PAY, OrderStatusEnum::SHIPMENTS, OrderStatusEnum::SING]) || (!empty($communityGoodsSetting['is_community_order']) && empty($communityGoodsSetting['community_goods_setting']['enable_refund']))) ){ throw new Exception('该订单状态下,无法申请售后'); } else if ( !in_array($order_detail->order_status, [OrderStatusEnum::PAY, OrderStatusEnum::SHIPMENTS, OrderStatusEnum::SING, OrderStatusEnum::TAKE, OrderStatusEnum::TAKE_FINISH]) || (!empty($communityGoodsSetting['is_community_order']) && empty($communityGoodsSetting['community_goods_setting']['enable_refund'])) ){ throw new Exception('该订单状态下,无法申请售后'); } // 社区团购订单只有待提货时能申请仅退款 if (!empty($communityGoodsSetting['is_community_order']) && $params['type'] != RefundTypeEnum::MONEY) { throw new Exception('该订单状态下,无法申请售后'); } } // 考虑部分发货的情况,如果就部分发货了,则不允许申请售后 if ($order_detail->shipped_num != $order_detail->num && $order_detail->shipped_num > 0) { throw new Exception('该订单未发货完成,无法申请售后'); } $order = Order::findOne(['id'=>$order_detail['order_id']]); // 是否允许申请售后事件 $event = new \common\events\mall\IsAllowFeedbackEvent($order_detail->mall_id); Yii::$app->services->events->dispatch($event, ['mall_id' => $order_detail->mall_id, 'order' => $order, 'order_detail' => $order_detail], $event->listeners); if (!$event->getIsAllow()) { throw new Exception($event->getMessage()); } // 公共调用 $order_detail = GlobalInvoke::exec(GlobalInvoke::ORDER_REFUND_SUBMIT, $order_detail->mall_id, [ 'order_detail' => $order_detail, 'mall_id' => $order_detail->mall_id, ]) ?: $order_detail; // if ($params['type'] <= RefundTypeEnum::MONEY && empty($params['refund_price'])) throw new Exception('退款金额需大于0'); $shipping_money = OrderRefund::isRefundShippingMoney($order_detail['order_id'],$order['shipping_money']); $params['shipping_money'] = $shipping_money; $total_money = $order_detail->goods_price + $order_detail->adjust_money; // 这里累加了运费金额, 总金额累加了运费,那么提交的退款金额也需要累加运费,因为这个运费不是客户提交过来的,而是通过系统计算出来的,所以都需要累加运费 if (bcadd($params['refund_price'], $shipping_money, 2) > bcadd($total_money,$shipping_money,2)){ throw new Exception('最多可退款金额¥' . number_format($total_money, 2,'.', '')); } $order_detail->is_feedback = OrderStatusEnum::FEEDBACKING; $order_detail->goods_price = $original_goods_price;// 防止随机减减扣的金额覆盖掉原实付金额,此金额下单后就不可改变 if(!$order_detail->save()) throw new Exception($order_detail->getErrorMessage()); // 处理售后步骤 if (!empty($params['pic_list'])) { $params['pic_list'] = json_decode($params['pic_list'], true); } else { $params['pic_list'] = []; } self::stepHandle($params); //退款主表 - 如果退款金额大于支付金额那么就智能退支付金额 if (bcadd($params['refund_price'], $shipping_money, 2) > bcmul($order->pay_money, 1, 2)) { $params['refund_price'] = bcmul($order->pay_money, 1, 2); } else { $params['refund_price']+=$shipping_money; } $params['is_feedback'] = OrderStatusEnum::FEEDBACKING; $params['order_id'] = $order_detail->order_id; $params['store_id'] = $order_detail->store_id; $params['mch_id'] = $order_detail->mch_id; $params['order_source'] = $order_detail->order_source; if (empty($params['is_full'])) { $params['is_full'] = "{$order_detail->order_id}_{$order_detail->id}"; } if ($order->store_id) { $params['goods_type'] = StoreGoods::find()->where(['id' => $order_detail->goods_id])->select('goods_type')->scalar(); } else { $params['goods_type'] = Goods::find()->where(['id' => $order_detail->goods_id])->select('goods_type')->scalar(); } if ($order->marketing_type == AddonsEnum::ADDONS_NAME_LAO_DA_FU) { $params['order_source'] = AddonsEnum::ADDONS_NAME_LAO_DA_FU; $params['goods_type'] = \addons\LaoDaFu\common\models\StoreGoods::find()->where(['id' => $order_detail->goods_id])->select('goods_type') ->scalar(); } $params['order_no'] = Order::generateOrderNo('r'); $order_refund_model = OrderRefund::setData($params); if(!$order_refund_model) throw new Exception(OrderRefund::getStaticError()); $params['order_refund_id'] = $order_refund_model->id; $res = OrderRefundStep::setData($params); if(!$res) throw new Exception(OrderRefundStep::getStaticError()); $trade = PaymentTrade::findOne(['out_trade_no' => $order->out_trade_no]); $trade->addRefundItem($order_refund_model, $order); //自动维护订单主表 $order = Order::findOne($params['order_id']); $res = Order::autoUpdateStatus($order); $t->commit(); //统计订单待评价消息数量 $orderStatis['user_id'] = $order->user_id; $orderStatis['mall_id'] = $order->mall_id; switch($order->order_status){ case OrderStatusEnum::PAY: $orderStatis['order_goods_num'] = -1; break; case OrderStatusEnum::SHIPMENTS: $orderStatis['order_received_num'] = -1; break; case OrderStatusEnum::SING: $orderStatis['order_evaluate_num'] = -1; break; } $orderStatis['order_return_num'] = 1; Yii::$app->services->rabbitMq->push(RabbitMqEnum::EXCHANGE_ORDER, RabbitMqEnum::ORDER_QUEUE, $orderStatis, OrderUnreadMsg::class, 'orderStastics'); // 触发售后统计 $refund_event = ['id' => $order_refund_model->id, 'type' => RefundTypeEnum::EVENT_APPLY]; Yii::$app->services->rabbitMq->push( RabbitMqEnum::EXCHANGE_TASK, RabbitMqEnum::TASK_QUEUE, [ 'type' => EventNameEnum::ORDER_REFUND, 'params' => $refund_event, ], StatisticsHandle::class, 'handleSync' ); return $order_refund_model; }catch(Exception $e){ $t->rollBack(); self::$static_error = $e->getMessage(); return false; } } /** * 步骤处理 * @Author bing * @DateTime 2021-10-21 16:32:05 * @copyright: Copyright (c) 2020 广东七件事集团 * @param array $params * @return void */ public static function stepHandle(&$params){ //步骤表 $content = []; $refund_type = RefundTypeEnum::getMap(); $content[] = '售后方式:' . $refund_type[$params['type']]; switch($params['type']){ case RefundTypeEnum::MONEY: $step = RefundStatusEnum::STEP_5; break; case RefundTypeEnum::MONEY_AND_PRODUCT: $step = RefundStatusEnum::STEP_1; break; case RefundTypeEnum::EXCHANGE_GOODS: $step = RefundStatusEnum::STEP_7; break; default: throw new Exception('售后方式错误'); } $status_text_arr = RefundStatusEnum::getStepStatusText($step); $content[] = $status_text_arr['desc'] ?? ''; $content[] = '选项:' . $params['reason']; $params['role'] = $data['role'] ?? RefundStatusEnum::BUYERS; $content[] = '售后说明:' . $params['remark']; $content[] = $params['pic_list']; if(in_array($params['type'],[RefundStatusEnum::STEP_5,RefundStatusEnum::STEP_1])){ if(!empty($params['shipping_money'])) $content[] = '运费:' . $params['shipping_money']; $content[] = '退款金额:' . $params['refund_price']; } // 返还优惠内容 $marketing = OrderMarketing::find()->select("deduct_score, deduct_currency")->where(['order_detail_id' => $params['order_detail_id']])->asArray()->one(); if (!empty($marketing)) { $discount = []; if (!empty($marketing['deduct_score'])) {// 返回积分 $deduct_currency = json_decode($marketing['deduct_currency'], true); if(isset($deduct_currency['midou_cy'])){ $discount[] = floatval($deduct_currency['midou_cy']['midou_cy']) . $deduct_currency['midou_cy']['name']; }else{ $score_name = Yii::$app->services->setting->mall->get($params['mall_id'],'score.score_name'); $discount[] = floatval($marketing['deduct_score']) . $score_name; } } !empty($discount) && $content[] = '需返优惠:' . implode('+', $discount); } $params['content'] = $content; // 获取当前可显示的步数 $params['step_num'] = RefundStatusEnum::getStepNumByStatus($step); $params['step_status'] = $step; } /** * 撤销申请 * @Author: hua * @DateTime: 2021/10/9 9:15 * @Copyright: copyright (c) 2021 广东七件事集团 * @param $params * @return bool */ public static function cancelRefund($params){ $t = Yii::$app->db->beginTransaction(); try{ //退款主表 $params['refund_status'] = RefundStatusEnum::REVOKE; if (!empty($params['id'])) { $where = ['id' => $params['id'], 'user_id' => $params['user_id']]; } else { $where = ['order_detail_id' => $params['order_detail_id'], 'user_id' => $params['user_id']]; } $order_refund_model = OrderRefund::find()->where($where)->orderBy('id desc')->one(); if(empty($order_refund_model)) throw new Exception('售后订单不存在或已删除'); if($order_refund_model->refund_status==RefundStatusEnum::FINISH) throw new Exception('售后完成'); $order_refund_model->refund_status = $params['refund_status']; $res = $order_refund_model->save(); if(!$res) throw new Exception(OrderRefund::getStaticError()); //订单详情表 $order_detail_model = OrderDetail::findOne($order_refund_model->order_detail_id); $order_detail_model->is_feedback = OrderStatusEnum::NOT_FEEDBACK; $res = $order_detail_model->save(); if(!$res) throw new Exception(OrderDetail::getStaticError()); //自动维护订单主表 $order = Order::findOne($order_detail_model->order_id); Order::autoUpdateStatus($order); $is_install = MallAddons::isInstall($params['mall_id'], AddonsEnum::ADDONS_NAME_STORE); if($is_install){ $store_order = StoreOrder::findOne(['order_no'=>$order['order_no']]); if(!empty($store_order)){ StoreOrder::autoUpdateStatus($store_order); StoreOrderDetail::updateAll(['is_feedback' => OrderStatusEnum::NOT_FEEDBACK, 'updated_at' => time()], ['main_order_detail_id' => $order_refund_model->order_detail_id]); } } // 取消售后订单 $event = new OrderRefundCancelEvent($order_refund_model['mall_id']); $data['id'] = $order_refund_model->id; $data['mall_id'] = $order_refund_model->mall_id; $data['operator_id'] = $params['operator_id'] ?? 0; $data['is_admin'] = (int)!empty($params['is_admin']); Yii::$app->services->events->dispatch($event, $data, $event->listeners); //统计订单待评价消息数量 $orderStatis['user_id'] = $order->user_id; $orderStatis['mall_id'] = $order->mall_id; switch($order->order_status){ case OrderStatusEnum::PAY: $orderStatis['order_goods_num'] = 1; break; case OrderStatusEnum::SHIPMENTS: $orderStatis['order_received_num'] = 1; break; case OrderStatusEnum::SING: $orderStatis['order_evaluate_num'] = 1; break; } //$orderStatis['order_return_num'] = -1; Yii::$app->services->rabbitMq->push(RabbitMqEnum::EXCHANGE_ORDER, RabbitMqEnum::ORDER_QUEUE, $orderStatis, OrderUnreadMsg::class, 'orderStastics'); $t->commit(); return true; }catch(Exception $e){ $t->rollBack(); self::$static_error = $e->getMessage(); return false; } } //是否退回运费 public static function isRefundShippingMoney($order_id,$shipping_money){ $order_detail_list = OrderDetail::lists([ 'where'=>[ ['order_id'=>$order_id], ['status'=>StatusEnum::ENABLED] ], 'select'=>'is_feedback,shipping_status']); $counts = 0; foreach ($order_detail_list as $val){ if(!empty($val['shipping_status'])){ $counts = 0; break; } if(empty($val['is_feedback'])) $counts++; } if($counts==1) return $shipping_money; return 0; } public static function exportHandle(array $data) { $download_id = $data['download_id'] ?? 0; $download = Download::findOne(['id' => $download_id]); if ($download) { try { $params = json_decode($download->params,true); $isChanjetExport = !empty($params['is_chanjet_addons']); $filename = $download->name; $type = $download->type; $order_detail_model = OrderRefund::find(); if(!empty($params['mch_id'])) $order_detail_model->where(['mch_id'=>$params['mch_id']]); $order_detail_model->where(['mall_id'=>$params['mall_id']]); $order_detail_model->andWhere(['>=','status',StatusEnum::DISABLED]); !empty($get['order_no']) && $order_detail_model->andWhere(['in', 'order_id', self::getOidByOrderNo($params['mall_id'], $get['order_no'])]); if (isset($get['refund_status'])) { $order_detail_model->andWhere(['=', 'refund_status', $get['refund_status']]); } else { $order_detail_model->andWhere(['in', 'refund_status', [RefundStatusEnum::APPLY,RefundStatusEnum::HANDEL,RefundStatusEnum::FINISH,RefundStatusEnum::RETURN_GOODS,RefundStatusEnum::EXCHANGE_GOODS,RefundStatusEnum::REFUSE]]); } if (!empty($get['type']) && !empty($get['keyword'])) $order_detail_model->andWhere(self::searchByKeyword($params['mall_id'], $get['type'], $get['keyword'])); $order_detail_model->with(['base_user','orderDetail','order']); if ($isChanjetExport) { $order_detail_model->with(['addonsChanjetRequest']); } $fields = $params['fields']; $fields_arr = self::fieldsList(null, $isChanjetExport); $have_select_field_arr = []; foreach ($fields as $value){ $have_select_field_arr[]=$fields_arr[$value]; } $csv = new CsvTool(); $csv->filename = $filename; $csv->file_dirname = DownloadEnum::getTypeStorageDirMap($type); $csv->export_mode = CsvTool::EXPORT_MODE_ASYNC; $csv->header = $have_select_field_arr; $refund_status_list = RefundStatusEnum::getMap(); $order_status_list = OrderStatusEnum::getMap(); $refund_type_list = RefundTypeEnum::getMap(); foreach ($order_detail_model->batch() as $order_details) { $csv->data = array_map(function($order_detail)use($fields,$refund_status_list,$refund_type_list,$order_status_list){ //var_dump($order_detail);die; $row = []; foreach ($fields as $field){ switch (true){ case (in_array($field,['created_at'])): $row[] = !empty($order_detail[$field])?date('Y-m-d H:i:s',$order_detail[$field]):''; break; case ($field=='order_id'): $row[] = $order_detail['order_id'] ?:''; break; case ($field=='order_no_a'): $row[] = $order_detail['order']['order_no'] ?:''; break; case ($field=='user_id'): $row[] = $order_detail['base_user']['id'] ?:''; break; case ($field=='username'): $row[] = $order_detail['base_user']['username'] ?:''; break; case ($field=='nickname'): $row[] = $order_detail['base_user']['nickname'] ?:''; break; case ($field=='user_mobile'): $row[] = $order_detail['base_user']['mobile'] ?:''; break; case ($field=='order_no'): $row[] = $order_detail['order_id'] ?:''; break; case ($field=='goods_name'): $row[] = $order_detail['orderDetail']['goods_name'] ?:''; break; case ($field == 'goods_price'): $row[] = $order_detail['orderDetail']['price'] ?:''; break; case ($field=='num'): $row[] = $order_detail['orderDetail']['num'] ?:''; break; case ($field=='refund_status'): $row[] = $refund_status_list[$order_detail['refund_status']] ?:''; break; case ($field=='order_status'): $row[] = $order_status_list[$order_detail['order']['order_status']] ?:''; break; case ($field=='price'): $row[] = $order_detail['orderDetail']['price']*$order_detail['orderDetail']['num'] ?:''; break; case ($field=='type'): $row[] = $refund_type_list[$order_detail['type']] ?:''; break; case ($field == 'refund_price'): $refund_price = $order_detail['refund_price'] ?:''; if($order_detail['refund_status'] == RefundStatusEnum::FINISH){ $refund_price = $order_detail['reality_refund_price'] ?:''; } $row[] = $refund_price; break; case ($field == 'reason'): $row[] = $order_detail['reason'] ?:''; break; case ($field == 'refuse_remark'): $row[] = $order_detail['remark'] ?:''; break; case ($field == 'refuse_address'): $row[] = $order_detail['order_id'] ?:''; break; case ($field == 'chanjet_updated_at'): if (isset($order_detail['addonsChanjetRequest']['updated_at'])) { $row[] = date('Y-m-d H:i:s', $order_detail['addonsChanjetRequest']['updated_at']); }else { $row[] = ''; } break; case ($field == 'chanjet_request_status'): if (isset($order_detail['addonsChanjetRequest']['request_status'])) { $row[] = AddonsChanjetRequestEnum::getMap()[$order_detail['addonsChanjetRequest']['request_status']] ?? ''; }else { $row[] = ''; } break; default: $row[] = !empty($order_detail[$field])?$order_detail[$field]:''; } } //var_dump($row); return $row; },$order_details); $csv->export(); } $csv->updateDown($download,$params['mall_id']); return true; } catch (\Exception $e) { $download->status = 3; $res = $download->save(); //var_dump($e->getMessage()); self::setStaticError($e->getMessage()); return $e->getMessage(); } } } public static function fieldsList($field = null, $isChanjetAddons = false){ $fields = [ 'order_id' => '订单ID', 'order_no_a' => '订单编号', 'user_id' => '用户ID', 'username' => '用户编号', 'nickname' => '用户昵称', 'user_mobile' => '用户手机号', 'order_no' => '售后编号', 'goods_name'=>'商品名称', 'goods_price' => '价格', 'num' => '数量', 'order_status' => '订单状态', 'refund_status' => '售后状态', 'price' => '商品价格', 'type' => '售后方式', 'refund_price' => '退款金额', 'reason' => '售后原因', 'refuse_remark' => '售后说明', 'refuse_address' => '退货地址', 'created_at'=>'申请时间' ]; if ($isChanjetAddons) { $fields['chanjet_updated_at'] = '最后推送时间'; $fields['chanjet_request_status'] = '推送状态'; } if ($field === null) return $fields; $temp = []; foreach ($field as $val) { if (isset($fields[$val])) $temp[$val] = $fields[$val]; } return $temp; } /** * 批量退款 * @param $params * @return false|void */ public static function batchRefundSync($params) { try { Yii::$app->services->rabbitMq->push(RabbitMqEnum::EXCHANGE_TASK_IMPORT_USER, RabbitMqEnum::IMPORT_USER, $params, self::class, 'batchRefundSyncExecute'); } catch (\Exception $e) { return false; } } /** * 异步请求批量回款 * @param $params */ public static function batchRefundSyncExecute($params) { try { if ($params['data']) { foreach ($params['data'] as $item) { $logic = new OrderRefundLogic(); $logic->execute($params['mall_id'], $item); } } } catch (\Exception $e) { } LockHelper::unFLock($params['redis_key']); } /** * 当前订单是否已完成售后 * * @return boolean */ public function isRefundFinish() { return in_array($this->refund_status, [RefundStatusEnum::FINISH, RefundStatusEnum::REFUSE, RefundStatusEnum::REVOKE]) ? true : false; } /** * 是否退回商品超时 * * @return boolean */ public function isReturnTimeoutOfRefund() { $step = $this->step[0]; $can_after_sale_time = Yii::$app->services->setting->mall->get($this->mall_id, 'order.can_after_sale_time') ?? 7; if ( $step && in_array($step->step_status, [RefundStatusEnum::STEP_2, RefundStatusEnum::STEP_8]) && ($step->created_at + $can_after_sale_time * 86400) < time() ) { return true; } return false; } /** * 获取真实退款金额 * * @param PaymentTrade $trade * @param array $params 退款外部参数(包含自定义退款金额) * @return float */ public function getRealityRefundPrice(PaymentTrade $trade, array $params = []) { return $trade->isMixedPay() ? $this->refund_price : ( // 自定义退款金额 !empty($params['refund_price']) ? $params['refund_price'] : $this->refund_price ); } }