| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329 |
- <?php
- /*
- * @Descripttion:
- * @copyright: Copyright (c) 2021 广东七件事集团
- * @Author: lun
- * @Date: 2022-01-01 16:01:21
- */
- namespace addons\Rebate\common\models;
- use addons\Rebate\common\enums\RebateEnum;
- use addons\Rebate\common\services\SettingService;
- use common\enums\StatusEnum;
- use common\models\user\User;
- use common\models\order\Order;
- use yii\db\Exception;
- /**
- * This is the model class for table "qimall_addons_rebate_buy".
- *
- * @property int $id
- * @property int $mall_id 商城id
- * @property int $r_id 对应qimall_addons_rebate.id
- * @property int $pid 分享者id
- * @property string $order_no 订单号
- * @property int $pay_at 支付时间
- * @property float $pay_money 实付金额,单位:元
- * @property string $goods_info 商品信息
- * @property int $user_id 消费者用户id
- * @property int $is_settlement 是否已结算[0:否;1:是]
- * @property int $order_settlement_status 订单结算状态[0:未达成;1:已达成]
- * @property int $status 状态[-1:删除;0:禁用;1启用]
- * @property int $created_at 创建时间
- * @property int $updated_at 更新时间
- * @property int $refund_id 订单退款id
- * @property int $refund_at 退款完成时间
- * @property int $settlement_at 达标时间
- * @property int $order_detail_id 订单详情id
- * @property int $is_reward_trigger 是否是此数据触发了奖励
- * @property int $position 第几位达标的
- */
- class RebateBuy extends \common\models\base\BaseActiveRecord
- {
- /**
- * {@inheritdoc}
- */
- public static function tableName()
- {
- return 'qimall_addons_rebate_buy';
- }
- /**
- * {@inheritdoc}
- */
- public function rules()
- {
- return [
- [['mall_id'], 'required'],
- [['mall_id', 'r_id', 'pid', 'pay_at', 'user_id', 'is_settlement', 'order_settlement_status', 'status', 'created_at', 'updated_at', 'is_virtual', 'refund_id', 'refund_at', 'settlement_at', 'order_detail_id', 'is_reward_trigger', 'position'], 'integer'],
- [['pay_money'], 'number'],
- [['order_no', 'goods_info'], 'string', 'max' => 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']]);
- }
- }
- }
- }
- }
|