| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858 |
- <?php
- namespace common\models\order;
- use addons\Chanjet\common\global_func\Request;
- use addons\Chanjet\common\models\AddonsChanjetRequest;
- use addons\Store\common\models\StoreGoods;
- use addons\Store\common\models\StoreOrder;
- use addons\Store\common\models\StoreOrderDetail;
- use common\components\export\CsvTool;
- use common\enums\AddonsChanjetRequestEnum;
- use common\enums\AddonsEnum;
- use common\enums\DownloadEnum;
- use common\enums\EventNameEnum;
- use common\enums\GoodsTypeEnum;
- use common\enums\OrderSourceEnum;
- use common\enums\OrderStatusEnum;
- use common\enums\RabbitMqEnum;
- use common\enums\RefundStatusEnum;
- use common\enums\RefundTypeEnum;
- use common\enums\ShippingTypeEnum;
- use common\events\order\OrderRefundEvent;
- use common\helpers\LockHelper;
- use common\logic\order\OrderRefundLogic;
- use common\logic\statistics\StatisticsHandle;
- use common\models\common\Download;
- use common\models\goods\Goods;
- use common\models\mall\MallAddons;
- use common\models\user\User;
- use common\enums\StatusEnum;
- use common\events\order\OrderRefundCancelEvent;
- use common\globals\GlobalInvoke;
- use common\models\common\PaymentTrade;
- use common\models\common\PaymentTradeOrder;
- use Yii;
- use yii\db\Exception;
- use yii\helpers\Json;
- /**
- * This is the model class for table "{{%order_refund}}".
- *
- *
- * @property int $id
- * @property int $mall_id
- * @property int $mch_id
- * @property int $store_id 门店id
- * @property int $user_id 用户id
- * @property int $order_id 订单id
- * @property int $order_detail_id 关联订单详情id
- * @property string $order_no 售后单号
- * @property int $type 售后类型:1=仅退款,2=退货退款,3=换货
- * @property string $reason 退款原因
- * @property string $remark 用户退款备注、说明
- * @property string $pic_list 用户上传图片凭证
- * @property string $refuse_remark 商家拒绝理由
- * @property string $express 快递公司
- * @property string $express_no 快递单号
- * @property string $saler_express 商家快递公司
- * @property string $customer_name 京东物流
- * @property string $saler_express_no 商家快递单号
- * @property string $saler_address 买家收货地址(json存储)
- * @property int $is_refund 是否打款,【0否,1是】
- * @property int $refund_at 打款时间
- * @property float $refund_price 退款金额
- * @property float $reality_refund_price 实际退款金额
- * @property int $express_at 买家发货时间
- * @property int $saler_express_at 卖家重新发货时间
- * @property int $step_status 售后步骤状态,对应qimall_order_refund_step.step_status最新状态
- * @property int $refund_status 售后状态
- * @property int $status 状态【1启用 0禁用 -1删除】
- * @property int $created_at 创建时间
- * @property int $updated_at 修改时间
- * @property int $goods_type 修改时间
- * @property int $num 修改时间
- * @property string $order_source 订单来源
- */
- class OrderRefund extends \common\models\base\BaseActiveRecord
- {
- /**
- * {@inheritdoc}
- */
- public static function tableName()
- {
- return '{{%order_refund}}';
- }
- /**
- * {@inheritdoc}
- */
- public function rules()
- {
- return [
- [['mall_id', 'mch_id', 'store_id', 'user_id', 'order_id', 'order_detail_id', 'type', 'is_refund', 'refund_at', 'express_at',
- 'saler_express_at', 'step_status', 'refund_status', 'status', 'created_at', 'updated_at', 'goods_type', 'num'], 'integer'],
- [['pic_list'], 'string'],
- [['refund_price', 'reality_refund_price','old_reality_refund_price'], 'number'],
- [['order_no', 'reason', 'remark', 'refuse_remark', 'express_no', 'saler_express_no', 'customer_name', 'refund_remark'], 'string', 'max' => 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
- );
- }
- }
|