| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260 |
- <?php
- /****************************************************************
- * Author: libaojia
- * Date: 2017/11/22 下午2:10
- * Email: livsyitian@163.com
- * QQ: 995265288
- * User: 芸众商城 www.yunzshop.com
- ****************************************************************/
- namespace app\common\services\finance;
- use app\common\facades\Setting;
- use app\common\models\Member;
- use app\common\models\Order;
- use Carbon\Carbon;
- use Illuminate\Support\Facades\DB;
- use Illuminate\Support\Facades\Log;
- use Yunshop\Love\Common\Services\LoveChangeService;
- class PointToLoveService
- {
- private $pointSet;
- private $pointAmount;
- private $orderCycleAmount;
- public function handleTransferQueue($uniacid)
- {
- Setting::$uniqueAccountId = \YunShop::app()->uniacid = $uniacid;
- $result = $this->transferStart();
- if ($result !== true) {
- \Log::info('--积分自动转入爱心值Uniacid:' . $uniacid . '自动转入失败--');
- }
- \Log::info('--积分自动转入爱心值Uniacid:' . $uniacid . '自动转入完成--');
- }
- private function pointSet()
- {
- return Setting::get('point.set');
- }
- /**
- * 积分持有总和,作为除数,不能返回零
- *
- * @return float
- */
- private function pointAmount()
- {
- if (!isset($this->pointAmount)) $this->pointAmount = $this->_pointAmount();
- return $this->pointAmount ?: 1;
- }
- /**
- * _积分持有总和
- *
- * @return float
- */
- private function _pointAmount()
- {
- //todo 需要排除已删除会员持有
- return Member::uniacid()->sum('credit1');
- }
- /**
- * 周期订单总和
- *
- * @return float
- */
- private function orderCycleAmount()
- {
- if (!isset($this->orderCycleAmount)) $this->orderCycleAmount = $this->_orderCycleAmount();
- return $this->orderCycleAmount;
- }
- /**
- * _周期订单总和
- *
- * @return float
- */
- private function _orderCycleAmount()
- {
- return Order::uniacid()->whereBetween('finish_time', $this->getTimeSlot())->sum('price');
- }
- /**
- * 周期时间:每周/每天
- *
- * @return array
- */
- private function getTimeSlot()
- {
- if ($this->pointSet['transfer_cycle'] == 1) {
- $startTime = Carbon::now()->subWeek(1)->startOfWeek()->timestamp;
- $endTime = Carbon::now()->subWeek(1)->endOfWeek()->timestamp;
- } else {
- $startTime = Carbon::yesterday()->startOfDay()->timestamp;
- $endTime = Carbon::yesterday()->endOfDay()->timestamp;
- }
- return [$startTime, $endTime];
- }
- private function changeValue($memberPoint, $rate)
- {
- if ($this->pointSet['transfer_compute_mode'] == 1) {
- $amount = bcdiv(bcmul($this->orderCycleAmount(), $rate, 4), 100, 4);
- $point = bcmul(bcdiv($amount, $this->pointAmount(), 4), $memberPoint, 2);
- } else {
- $point = bcdiv(bcmul($memberPoint, $rate, 4), 100, 2);
- }
- return $point;
- }
- public function transferStart()
- {
- $this->pointSet = $this->pointSet();
- $members = Member::uniacid()->where('credit1', '>', 0)->with('pointLove')->get();
- foreach ($members as $key => $member) {
- $rate = $this->getRate($member);
- $change_value = $this->changeValue($member->credit1, $rate);
- if ($change_value <= 0) {
- continue;
- }
- DB::beginTransaction();
- try {
- $point_change_data = [
- 'point_income_type' => PointService::POINT_INCOME_LOSE,
- 'point_mode' => PointService::POINT_MODE_TRANSFER_LOVE,
- 'member_id' => $member->uid,
- 'point' => -$change_value,
- 'remark' => '积分自动转入:' . $change_value . '转入比例:' . $rate,
- ];
- //修改用户积分
- $result = (new PointService($point_change_data))->changePoint();
- if (!$result) {
- Log::info('积分自动转入爱心值失败', print_r($point_change_data, true));
- DB::rollBack();
- continue;
- }
- $change_value = $this->getExchange($member, $change_value);
- $love_change_data = [
- 'member_id' => $member->uid,
- 'change_value' => $change_value,
- 'operator' => 0,
- 'operator_id' => 0,
- 'remark' => '积分自动转入:' . $change_value . '转入比例:' . $rate,
- 'relation' => ''
- ];
- //修改爱心值
- $result = (new LoveChangeService())->pointTransfer($love_change_data);
- if (!$result) {
- Log::info('积分自动转入爱心值失败', print_r($love_change_data, true));
- DB::rollBack();
- continue;
- }
- DB::commit();
- } catch (\Exception $e) {
- Log::info('积分自动转入爱心值失败' . $e->getMessage(), print_r($love_change_data, true));
- DB::rollBack();
- continue;
- }
- }
- return true;
- }
- private function getRate($memberModel)
- {
- //如果转入类型是营业额,直接只用全局比例
- if ($this->pointSet['transfer_compute_mode'] == 1) {
- return $this->pointSet['transfer_love_rate'] ?: 0;
- }
- $set = $this->pointSet;
- $rate = 0;
- //如果全局比例为空、为零
- if (empty($set['transfer_love_rate'])) {
- $rate = 0;
- }
- //全局比例设置
- if (isset($set['transfer_love_rate']) && $set['transfer_love_rate'] > 0) {
- $rate = $set['transfer_love_rate'];
- }
- //会员独立设置判断
- if (isset($memberModel->pointLove) && $memberModel->pointLove->rate > 0) {
- $rate = $memberModel->pointLove->rate;
- }
- //独立设置为 -1,跳过此会员
- if (isset($memberModel->pointLove) && $memberModel->pointLove->rate == -1) {
- $rate = 0;
- }
- return $rate;
- }
- private function getExchange($memberModel, $change_value)
- {
- $set = Setting::get('point.set');
- $transfer_integral = 1;
- $transfer_love = 1;
- //如果全局比例为空
- if (empty($set['transfer_integral']) || empty($set['transfer_integral_love'])) {
- $transfer_integral = 1;
- $transfer_love = 1;
- }
- //全局比例设置
- if (isset($set['transfer_integral']) && $set['transfer_integral'] > 0) {
- $transfer_integral = $set['transfer_integral'];
- }
- //全局比例设置
- if (isset($set['transfer_integral_love']) && $set['transfer_integral_love'] > 0) {
- $transfer_love = $set['transfer_integral_love'];
- }
- //会员独立设置判断
- if (isset($memberModel->pointLove) && $memberModel->pointLove > 0) {
- //判断会员是否单独设置积分转入爱心值比例
- if ($memberModel->pointLove->transfer_love && $memberModel->pointLove->transfer_integral) {
- $transfer_love = $memberModel->pointLove->transfer_love;
- $transfer_integral = $memberModel->pointLove->transfer_integral;
- }
- }
- $rate = bcmul(bcdiv($transfer_love, $transfer_integral, 4), $change_value, 2);
- return $rate;
- }
- }
|