custom->logs('mall_id不存在', compact('data')); return; } if (empty($data['behavior']) || !isset(OrderBehaviorLogsEnum::getMap()[$data['behavior']])) { $data['method'] = __METHOD__; Yii::$app->custom->logs('行为类型不存在', $data); return; } try { $data['ip'] = ArrayHelper::get_client_ip(); $data['operation_time'] = time(); $data['mall_id'] = !empty($data['mall_id']) ? $data['mall_id'] : $mallId; $event = new OrderBehaviorLogsEvent($data['mall_id']); Yii::$app->services->events->dispatch($event, $data, $event->listeners); } catch (Exception $e) { $data['method'] = __METHOD__; Yii::$app->custom->logs(FormatHelper::exception($e, '触发用户行为事件失败'), compact('data')); } } /** * 根据传入的数据,完善模型写入时所需的数据 * * @param array $params * * @return void */ protected static function getInsertDataByParams(array &$params) { empty($params['order_id']) && $params['order_id'] = $params['id'] ?? 0; switch ($params['behavior']) { case OrderBehaviorLogsEnum::OPERATOR_ORDER_PAID: // 订单支付 // 如果空就是用户支付,不为空就是后台支付 if (empty($params['operator_id'])) { $params['operator_id'] = Order::find() ->select('user_id') ->where(['id' => $params['order_id']]) ->scalar(); } break; case OrderBehaviorLogsEnum::OPERATOR_APPRAISE: // 评价 $orderCommentsListParams = [ 'where' => [['=', 'status', StatusEnum::ENABLED], ['=', 'order_id', $params['order_id']]], 'select' => 'content, order_detail_id' ]; $orderCommentsLists = OrderComments::lists($orderCommentsListParams); $orderDetailsParams = [ 'where' => [['=', 'status', StatusEnum::ENABLED], ['in', 'id', array_column($orderCommentsLists, 'order_detail_id')]], 'select' => 'id, goods_name', 'index' => 'id' ]; $orderDetailsLists = OrderDetail::lists($orderDetailsParams); $params['desc'] = ''; foreach ($orderCommentsLists as $commentItem) { $params['desc'] .= sprintf('商品:%s 评价:%s', $orderDetailsLists[$commentItem['order_detail_id']]['goods_name'] ?? '', $commentItem['content']); } break; case OrderBehaviorLogsEnum::OPERATOR_CANCEL_SHIPMENT: // 取消发货 case OrderBehaviorLogsEnum::OPERATOR_SHIPMENTS: // 发货 case OrderBehaviorLogsEnum::OPERATOR_MODIFY_LOGISTICS: // 修改物流 $params['desc'] = ''; // 查询发货信息 $orderExpress = OrderExpress::find() ->where(['id' => $params['id']]) ->select('order_id, order_detail_ids, buyer_id, operator_id, shipping_type') ->asArray() ->one(); if (empty($orderExpress)) { break; } $orderDetailsIds = json_decode($orderExpress['order_detail_ids'], true); $orderDetailsList = OrderDetail::getOrderDetails([['id' => $orderDetailsIds]], [], true, 'goods_name, num'); foreach ($orderDetailsList as $item) { $params['desc'] .= sprintf('商品:%s %d件;', $item['goods_name'], $item['num']); } $params['desc'] = trim($params['desc'], ';'); $sendType = [0 => '无需物流', 1 => '快递']; if (isset($sendType[$orderExpress['shipping_type']])) { $params['desc'] .= '-' . $sendType[$orderExpress['shipping_type']]; } $params['order_id'] = $orderExpress['order_id']; $params['extra_info']['order_detail_ids'] = $orderDetailsIds; $params['extra_info']['shipping_type'] = $orderExpress['shipping_type']; $params['extra_info']['order_express_id'] = $params['order_express_id']; if (!empty($params['shipping_change'])) { $params['extra_info']['shipping_change'] = $params['shipping_change']; } break; case OrderBehaviorLogsEnum::OPERATOR_REFUND: // 售后 case OrderBehaviorLogsEnum::OPERATOR_CANCEL_REFUND: // 撤销售后 $params['extra_info']['order_detail_id'] = self::getValueOrReturnDefault($params, 'order_detail_id', 0); $params['extra_info']['refund_id'] = self::getValueOrReturnDefault($params, 'id', 0); $params['extra_info']['step_status'] = self::getValueOrReturnDefault($params, 'step_status', 0); // 如果是取消售后的情况,是否是超过期限之后撤销的售后 if (!empty($params['is_expired'])) { $params['extra_info']['is_expired'] = $params['is_expired']; } // 是否是后台手动退款 if (!empty($params['is_manual'])) { $params['extra_info']['is_manual'] = $params['is_manual']; } // 拒绝原因 if (isset($params['refund_reason'])) { $params['extra_info']['refund_reason'] = $params['refund_reason']; } // 后台主动退款 if (isset($params['admin_handler_refund'])) { $params['extra_info']['admin_handler_refund'] = $params['admin_handler_refund']; } $params['desc'] = ''; // 得到order_id if (!empty($params['extra_info']['refund_id'])) { $orderRefundOne = OrderRefund::find() ->where(['id' => $params['extra_info']['refund_id']]) ->select('order_id, order_detail_id, order_no') ->asArray() ->one(); if ($orderRefundOne) { $params['order_id'] = $orderRefundOne['order_id'] ?? 0; if (empty($params['extra_info']['order_detail_id'])) { $params['extra_info']['order_detail_id'] = $orderRefundOne['order_detail_id'] ?? 0; } $params['desc'] .= sprintf('售后单号:%s,', $orderRefundOne['order_no']); } } // 设置退款的商品名称 if (!empty($params['extra_info']['order_detail_id'])) { $orderDetail = OrderDetail::find() ->where(['id' => $params['extra_info']['order_detail_id'], 'status' => StatusEnum::ENABLED]) ->select('goods_name, num') ->asArray() ->one(); if ($orderDetail) { $params['desc'] .= sprintf('商品:%s %d件', $orderDetail['goods_name'], $orderDetail['num']); } } break; case OrderBehaviorLogsEnum::OPERATOR_REMARK: // 新增备注 $params['desc'] = $params['seller_remark'] ?? ''; $params['extra_info']['is_batch'] = $params['is_batch'] ?? 0; // 是否是批量 break; case OrderBehaviorLogsEnum::OPERATOR_MESSAGE: // 留言 $params['desc'] = $params['message'] ?? ''; $params['extra_info']['is_batch'] = $params['is_batch'] ?? 0; // 是否是批量 break; case OrderBehaviorLogsEnum::OPERATOR_MODIFY_ADDRESS: // 修改收货地址 $params['desc'] = sprintf( '原地址:收货人:%s,收货人手机号:%s,收货地址:%s %s。新地址:收货人:%s,收货人手机号:%s,收货地址:%s %s', $params['old_receiver_name'] ?? '', $params['old_mobile'] ?? '', $params['old_region_name'] ?? '', $params['old_address'] ?? '', $params['receiver_name'] ?? '', $params['mobile'] ?? '', $params['region_name'] ?? '', $params['address'] ?? '' ); break; } // 不是系统操作的则判断是管理员还是用户 if (!self::setSystemType($params)) { if (!isset($params['operator_user_id'])) { if (isset($params['operator_id'])) { $params['operator_user_id'] = $params['operator_id']; } elseif (!empty($params['user_id'])) { $params['operator_user_id'] = $params['user_id']; } } if (!isset($params['operator_user_type'])) { $params['operator_user_type'] = OrderBehaviorLogsEnum::OPERATOR_USER_TYPE_USER; $fieldValue = [ 'is_mch' => OrderBehaviorLogsEnum::OPERATOR_USER_TYPE_MCH, 'is_aiyunuo' => OrderBehaviorLogsEnum::OPERATOR_USER_TYPE_AIYUNUO, 'is_store' => OrderBehaviorLogsEnum::OPERATOR_USER_TYPE_STORE, 'is_admin' => OrderBehaviorLogsEnum::OPERATOR_USER_TYPE_ADMIN, ]; foreach ($fieldValue as $field => $value) { if (!empty($params[$field])) { $params['operator_user_type'] = $value; break; } } } // 只有系统操作operator_user_id才会=0,所以,不是系统的行为,并且operator_user_id=0,那就给订单号用户 if (empty($params['operator_user_id']) && !empty($params['order_id'])) { $params['operator_user_type'] = OrderBehaviorLogsEnum::OPERATOR_USER_TYPE_USER; $params['operator_user_id'] = Order::find() ->where(['id' => $params['order_id']]) ->select('user_id') ->scalar(); } } } /** * 检查是不是系统自动操作的 * * @param array $params * * @return bool */ protected static function setSystemType(array &$params): bool { if ((isset($params['operator_id']) && $params['operator_id'] == 0) || !empty($params['is_system_auto'])) { $params['operator_user_type'] = OrderBehaviorLogsEnum::OPERATOR_USER_TYPE_SYSTEM; $params['operator_user_id'] = 0; return true; } return false; } /** * 将行为事件写入队列 * * @param array $data * * @return void */ public static function logsPushQueue(array $data) { try { Yii::$app->services->rabbitMq->push( RabbitMqEnum::EXCHANGE_TASK, RabbitMqEnum::TASK_QUEUE, $data, self::class, 'handleSync' ); } catch (Exception $e) { $data['method'] = __METHOD__; Yii::$app->custom->logs(FormatHelper::exception($e, '行为日志发布队列失败'), $data); } } /** * @param array $data * @param string $key * @param string $defaultValue * * @return mixed */ protected static function getValueOrReturnDefault(array $data, string $key, string $defaultValue = '') { return $data[$key] ?? $defaultValue; } }