| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320 |
- <?php
- namespace common\services\mall\order;
- use common\enums\OrderBehaviorLogsEnum;
- use common\enums\RabbitMqEnum;
- use common\enums\ShippingTypeEnum;
- use common\enums\StatusEnum;
- use common\events\order\OrderBehaviorLogsEvent;
- use common\helpers\ArrayHelper;
- use common\helpers\FormatHelper;
- use common\models\order\Order;
- use common\models\order\OrderBehaviorLogs;
- use common\models\order\OrderComments;
- use common\models\order\OrderDetail;
- use common\models\order\OrderExpress;
- use common\models\order\OrderRefund;
- use Exception;
- use InvalidArgumentException;
- use Yii;
- class OrderBehaviorLogsService
- {
- /**
- * 处理用户行为事件
- *
- * @param array $data
- *
- * @return void
- */
- public static function handleSync(array $data)
- {
- self::getInsertDataByParams($data);
- OrderBehaviorLogs::setData($data);
- }
- /**
- * 触发行为记录事件
- *
- * @param int $mallId
- * @param array $data
- *
- * @return void
- */
- public static function dispatchUserBehaviorLogsEvent(int $mallId, array $data)
- {
- if (empty($mallId) && empty($data['mall_id'])) {
- $data['method'] = __METHOD__;
- Yii::$app->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;
- }
- }
|