diff --git a/app/common/dao/user/IntegralDao.php b/app/common/dao/user/IntegralDao.php new file mode 100644 index 0000000..2e81a1c --- /dev/null +++ b/app/common/dao/user/IntegralDao.php @@ -0,0 +1,46 @@ + +// +---------------------------------------------------------------------- + + +namespace app\common\dao\user; + + +use app\common\dao\BaseDao; +use app\common\model\BaseModel; +use app\common\model\user\Integral; + +/** + * Common: 用户积分 + * Author: wu-hui + * Time: 2023/11/07 10:13 + * Class IntegralDao + * @package app\common\dao\user + */ +class IntegralDao extends BaseDao{ + + /** + * Common: 初始化模型 + * Author: wu-hui + * Time: 2023/11/07 10:13 + * @return BaseModel + */ + protected function getModel(): string + { + return Integral::class; + } + + + + + + +} diff --git a/app/common/model/user/Integral.php b/app/common/model/user/Integral.php new file mode 100644 index 0000000..e43f815 --- /dev/null +++ b/app/common/model/user/Integral.php @@ -0,0 +1,47 @@ + +// +---------------------------------------------------------------------- + + +namespace app\common\model\user; + + +use app\common\model\BaseModel; + +class Integral extends BaseModel +{ + + /** + * @return string + * @author xaboy + * @day 2020-03-30 + */ + public static function tablePk(): string + { + return 'integral_id'; + } + + /** + * @return string + * @author xaboy + * @day 2020-03-30 + */ + public static function tableName(): string + { + return 'integral'; + } + + public function user() + { + return $this->hasOne(User::class, 'uid', 'uid'); + } + +} diff --git a/app/common/repositories/store/order/StoreOrderRepository.php b/app/common/repositories/store/order/StoreOrderRepository.php index 82f2bb5..731819d 100644 --- a/app/common/repositories/store/order/StoreOrderRepository.php +++ b/app/common/repositories/store/order/StoreOrderRepository.php @@ -33,6 +33,7 @@ use app\common\repositories\system\attachment\AttachmentRepository; use app\common\repositories\system\merchant\FinancialRecordRepository; use app\common\repositories\system\merchant\MerchantRepository; use app\common\repositories\system\serve\ServeDumpRepository; +use app\common\repositories\user\IntegralRepository; use app\common\repositories\user\UserBillRepository; use app\common\repositories\user\UserBrokerageRepository; use app\common\repositories\user\UserMerchantRepository; @@ -496,7 +497,7 @@ class StoreOrderRepository extends BaseRepository */ public function getNewOrderId($type) { - list($msec, $sec) = explode(' ', microtime()); + [$msec, $sec] = explode(' ', microtime()); $msectime = number_format((floatval($msec) + floatval($sec)) * 1000, 0, '', ''); $orderId = $type . $msectime . mt_rand(10000, max(intval($msec * 10000) + 10000, 98369)); return $orderId; @@ -644,18 +645,33 @@ class StoreOrderRepository extends BaseRepository return $data; } - public function giveIntegral($groupOrder) - { - if ($groupOrder->give_integral > 0) { - app()->make(UserBillRepository::class)->incBill($groupOrder->uid, 'integral', 'lock', [ - 'link_id' => $groupOrder['group_order_id'], - 'status' => 0, - 'title' => '下单赠送积分', - 'number' => $groupOrder->give_integral, - 'mark' => '成功消费' . floatval($groupOrder['pay_price']) . '元,赠送积分' . floatval($groupOrder->give_integral), - 'balance' => $groupOrder->user->integral - ]); + public function giveIntegral($groupOrder){ + // Log::info('赠送积分 - group-order' . var_export(is_array($groupOrder->user->toArray()) ? $groupOrder->user->toArray() : $groupOrder->user, true)); + // 修改:每个订单单独赠送积分并且实时到账,同时区分商户id + foreach($groupOrder->orderList as $orderInfo){ + $giveIntegral = (float)sprintf("%.2f",$orderInfo->give_integral); + if ($giveIntegral > 0) { + // 总积分到账 + app()->make(UserRepository::class)->incIntegral((int)$orderInfo->uid,$giveIntegral,'订单赠送积分','lock',[ + 'number' => $giveIntegral, + 'mark' => '成功消费' . (float)sprintf("%.2f",$orderInfo->pay_price) . '元,赠送积分' . $giveIntegral + ]); + // 商户积分变更 + app()->make(IntegralRepository::class)->changeIntegral((int)$orderInfo->uid,(int)$orderInfo->mer_id,$giveIntegral); + } } + + # 2023-11-7 弃用,由指定时间到账修改为实时到账,并且区分每个商户的积分 + // if ($groupOrder->give_integral > 0) { + // app()->make(UserBillRepository::class)->incBill($groupOrder->uid, 'integral', 'lock', [ + // 'link_id' => $groupOrder['group_order_id'], + // 'status' => 0, + // 'title' => '下单赠送积分', + // 'number' => $groupOrder->give_integral, + // 'mark' => '成功消费' . floatval($groupOrder['pay_price']) . '元,赠送积分' . floatval($groupOrder->give_integral), + // 'balance' => $groupOrder->user->integral + // ]); + // } } /** diff --git a/app/common/repositories/user/IntegralRepository.php b/app/common/repositories/user/IntegralRepository.php new file mode 100644 index 0000000..38827b8 --- /dev/null +++ b/app/common/repositories/user/IntegralRepository.php @@ -0,0 +1,61 @@ + +// +---------------------------------------------------------------------- + + +namespace app\common\repositories\user; + +use app\common\dao\user\IntegralDao; +use app\common\repositories\BaseRepository; + +/** + * Common: ... + * Author: wu-hui + * Time: 2023/11/07 10:34 + * Class IntegralRepository + * @package app\common\repositories\user + */ +class IntegralRepository extends BaseRepository +{ + /** + * @var IntegralDao + */ + protected $dao; + + /** + * IntegralRepository constructor. + * @param IntegralDao $dao + */ + public function __construct(IntegralDao $dao) + { + $this->dao = $dao; + } + /** + * Common: 积分变更 + * Author: wu-hui + * Time: 2023/11/07 10:45 + * @param int $uid + * @param int $mer_id + * @param float $changeNumber + */ + public function changeIntegral(int $uid, int $mer_id, float $changeNumber){ + $info = $this->dao->findOrCreate([ + 'uid' => $uid, + 'mer_id' => $mer_id + ]); + $info->number = (float)sprintf("%.2f",$info->number + $changeNumber); + $info->save(); + } + + + + +} diff --git a/app/common/repositories/user/UserRepository.php b/app/common/repositories/user/UserRepository.php index 2c2240f..8924dbd 100644 --- a/app/common/repositories/user/UserRepository.php +++ b/app/common/repositories/user/UserRepository.php @@ -1287,9 +1287,9 @@ class UserRepository extends BaseRepository 'link_id' => 0, 'status' => 1, 'title' => $title, - 'number' => $data['number'], + 'number' => $data['number'] ?? $number, 'mark' => $data['mark'], - 'balance' =>$data['balance'], + 'balance' =>$data['balance'] ?? $user->integral, ]); }); } diff --git a/crmeb/listens/AutoClearIntegralListen.php b/crmeb/listens/AutoClearIntegralListen.php index 88c6cf3..146355e 100644 --- a/crmeb/listens/AutoClearIntegralListen.php +++ b/crmeb/listens/AutoClearIntegralListen.php @@ -36,6 +36,7 @@ class AutoClearIntegralListen extends TimerService implements ListenerInterface $this->tick(1000 * 60 * 20, function () { request()->clearCache(); if (!systemConfig('integral_status')) return; + if ((int)systemConfig('integral_clear_time') <= 0) return;// 过期时间未设置或者为0 则永不过期 $make = app()->make(IntegralRepository::class); $end = $make->getTimeoutDay(); if ($end == strtotime(date('Y-m-d') . ' 00:00:00')) { @@ -52,7 +53,8 @@ class AutoClearIntegralListen extends TimerService implements ListenerInterface usleep(100); }); } - } else if ($end < strtotime('+15 day')) { + } + else if ($end < strtotime('+15 day')) { $make1 = app()->make(UserBillRepository::class); $invalidDay = $make->getInvalidDay(); $cache = Cache::store('file');