255], ]; } /** * {@inheritdoc} */ public function attributeLabels() { return [ 'id' => 'ID', 'mall_id' => '商城id', 'r_id' => '对应qimall_addons_rebate.id', 'pid' => '分享者id', 'order_no' => '订单号', 'pay_at' => '支付时间', 'pay_money' => '实付金额,单位:元', 'goods_info' => '商品信息', 'user_id' => '消费者用户id', 'is_settlement' => '是否已结算[0:否;1:是]', 'order_settlement_status' => '订单结算状态[0:未达成;1:已达成]', 'status' => '状态[-1:删除;0:禁用;1启用]', 'created_at' => '创建时间', 'updated_at' => '更新时间', 'refund_id' => '订单退款id', 'refund_at' => '退款完成时间', 'settlement_at' => '达标时间', 'order_detail_id' => '订单详情id', 'is_reward_trigger' => '是否是此数据触发了奖励', 'position' => '第几位达标的', ]; } /** * 获取关联活动 * @Author: lun * @DateTime: 2022/1/15 0015 9:31 * @Copyright: copyright (c) 2021 广东七件事集团 * @return \yii\db\ActiveQuery */ public function getUser() { return $this->hasOne(User::class, ['id' => 'user_id']); } /** * 关联订单信息 * @Author:lun * @Date:2024-04-05 17:26 * @Copyright:copyright(c)2024 广东七件事集团 * @return \yii\db\ActiveQuery */ public function getOrder() { return $this->hasOne(Order::class, ['order_no' => 'order_no']); } public function getRewardLog() { return $this->hasOne(RebateRewardLog::class, ['id' => 'reward_id']); } public function getPUser() { return $this->hasOne(User::class, ['id' => 'pid']); } /** * 保存数据 * @Author: lun * @DateTime: 2022/1/15 0015 9:31 * @Copyright: copyright (c) 2021 广东七件事集团 * @param array $params * @return array | bool */ public static function setData(array $params) { try{ $model = new self(); $model->loadDefaultValues(); if(!$model->load($params, '') || !$model->save()) throw new Exception($model->getErrorMessage()); return $model->toArray(); }catch(\Exception $e){ self::setStaticError($e->getMessage()); return false; } } /** * 获取未结算的订单 * * @param [type] $mall_id * @param [type] $r_id * @param [type] $pid * @return array */ public static function getNoSettlementList($mall_id, $r_id, $pid) { $where = ['mall_id' => $mall_id, 'r_id' => $r_id, 'pid' => $pid, 'is_settlement' => 0, 'order_settlement_status' => 1, 'status' => 1]; return self::find()->select("id")->where($where)->orderBy("id asc")->asArray()->column(); } /** * 获取对应活动推荐的订单数量 * @Author:lun * @Date:2024-04-05 17:41 * @Copyright:copyright(c)2024 广东七件事集团 * @param $mall_id * @param $pid * @param $r_id * @return bool|int|string|null */ public static function GetRecommendNumCount($mall_id, $pid, $r_id) { $where = ['mall_id' => $mall_id, 'r_id' => $r_id, 'pid' => $pid, 'status' => 1]; return self::find()->where($where)->count(); } /** * 修复订单退款id 订单详情id 达标时间 退款时间字段 * * @return void */ public static function fixFields() { // 存储每个商城的结算方式 $mallSettlementMethod = []; $settingService = new SettingService([]); $find = self::find(); self::paramPack([ 'select' => 'id, mall_id, order_no, goods_info, updated_at, order_settlement_status', 'with' => [ 'order' => function ($query) { $query ->with([ 'detail' => function ($query) { $query ->with([ 'refundFinish' => function ($query) { $query->select('id, order_detail_id, refund_at'); } ]) ->select('id, order_id, goods_id'); } ]) ->select('order_no, id, finish_time, pay_time'); } ] ], $find); foreach ($find->asArray()->batch(2000) as $batchItem) { foreach ($batchItem as $item) { if (!empty($item['refund_id'] || !empty($item['refund_at']) || !empty($item['settlement_at']) || !empty($item['order_detail_id']))) { continue; } $updateData = []; if ($item['order_settlement_status'] == StatusEnum::ENABLED) { // 得到每个商城的结算方式,不考虑修改过配置的情况。 if (!isset($mallSettlementMethod[$item['mall_id']])) { $settingService->mall_id = $item['mall_id']; $config = $settingService->getSetting(); $mallSettlementMethod[$item['mall_id']] = $config['settlement_method']; } // 根据配置得到订单达标时间 switch ($mallSettlementMethod[$item['mall_id']]) { case RebateEnum::SETTLEMENT_TYPE_PAY: $updateData['settlement_at'] = $item['order']['pay_time'] ?? $item['updated_at']; break; case RebateEnum::SETTLEMENT_TYPE_SALE: $updateData['settlement_at'] = $item['order']['finish_time'] ?? $item['updated_at']; break; default: break; } } if (!empty($item['order']['detail'])) { // 一个订单有多条个商品 if (count($item['order']['detail']) > 1) { $goodsInfo = json_decode($item['goods_info'], true) ?: []; if (empty($goodsInfo['id'])) { continue; } foreach ($item['order']['detail'] as $orderDetailItem) { if ($orderDetailItem['goods_id'] == $goodsInfo['id']) { $orderDetail = $orderDetailItem; break; } } } else { $orderDetail = $item['order']['detail'][0]; } if (empty($orderDetail)) { continue; } $updateData['order_detail_id'] = $orderDetail['id']; if (!empty($orderDetail['refundFinish'])) { $updateData['refund_id'] = $orderDetail['refundFinish']['id']; $updateData['refund_at'] = $orderDetail['refundFinish']['refund_at']; } } if (!empty($updateData)) { self::updateAll($updateData, ['id' => $item['id']]); } } } // 1.得到多个达标订单,哪个订单才是最终触发得到奖励的订单 // 2.维护数据的达标顺序,第一个达标的则是第一位,第二个达标的则是第二位 $find = self::find(); self::paramPack([ 'select' => 'id, settlement_at, r_id, pid, reward_id', 'where' => [ [ 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED], 'order_settlement_status' => StatusEnum::ENABLED ] ] ], $find); $all = $find->asArray()->all(); // 用于记录最新达标时间(最大的就是最终触发奖励的数据) $maxSettlementAt = []; // 用于排序后更新达标顺序 $settlementArrs = []; foreach ($all as $item) { if ($item['reward_id']) { if ( !isset($maxSettlementAt[$item['reward_id']]) || $item['settlement_at'] > $maxSettlementAt[$item['reward_id']]['settlement_at'] ) { $maxSettlementAt[$item['reward_id']] = ['id' => $item['id'], 'settlement_at' => $item['settlement_at']]; } } // 处理排序 $settlementArrs[$item['r_id'] . '-' . $item['pid']][] = ['id' => $item['id'], 'settlement_at' => $item['settlement_at']]; } // 更新为触发奖励的订单 if (!empty($maxSettlementAt)) { self::updateAll(['is_reward_trigger' => StatusEnum::ENABLED], ['id' => array_column($maxSettlementAt, 'id')]); } if (!empty($settlementArrs)) { // 对订单按达标时间排序 foreach ($settlementArrs as $settlementArr) { usort($settlementArr, function($a, $b) { return [$a['settlement_at'], $a['id']] <=> [$b['settlement_at'], $b['id']]; }); foreach ($settlementArr as $index => $item) { self::updateAll(['position' => $index + 1], ['id' => $item['id']]); } } } } }