bztang-admin/plugins/cultural-space/src/models/ContributionBonusLog.php

273 lines
12 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace Yunshop\CulturalSpace\models;
use app\common\models\BaseModel;
use app\common\models\Member;
use app\common\models\member\MemberChildren;
use app\common\models\Order;
use app\common\models\OrderGoods;
use app\common\models\UniAccount;
use app\common\facades\Setting;
use app\common\services\income\IncomeService;
use Illuminate\Support\Facades\DB;
class ContributionBonusLog extends BaseModel{
public $table = 'yz_cultural_space_contribution_bonus_log';
public $timestamps = false;
protected $hidden = ['uniacid'];
public $casts = [
'created_at' => 'datetime:Y-m-d H:i:s',
];
protected $fillable = ['uniacid','uid','total_money','money','total_contribution','hold_contribution','proportion','created_at'];
// 贡献分享分红相关内容
private $orderTotalMoney = 0;// 周期订单总金额
private $bonusTotalMoney = 0;// 分红总销售额(周期订单总金额的N%)
/**
* Common: 获取分红记录
* Author: wu-hui
* Time: 2023/11/03 15:53
* @param $search
* @return array
*/
public function getList($search){
// 条件生成
$where = [];
if($search['uid'] > 0) $where[] = ['uid','=',$search['uid']];
if($search['is_settlement'] >= 0 && $search['is_settlement'] != '') $where[] = ['is_settlement','=',$search['is_settlement']];
// 列表获取
$list = self::uniacid()
->select(['id','uid','total_money','money','total_contribution','hold_contribution','proportion','is_settlement','created_at'])
->where($where)
->with([
'member' => function($query){
$query->select(['uid','nickname','realname','avatar']);
}
])
->orderBy('created_at','DESC')
->orderBy('id','DESC')
->paginate(10);
return $list ? $list->toArray() : [];
}
/**
* Common: 获取用户贡献分享分红
* Author: wu-hui
* Time: 2023/11/20 16:06
* @param int $uid 用户id
* @param string $incomeStatus all=全部收益undrawn=未提现收益withdrawn=已提现收益
* @return mixed
*/
public static function getIncomeSum(int $uid,string $incomeStatus = 'all'){
return self::uniacid()
->leftJoin('yz_member_income', function ($join) {
$join->on('yz_member_income.member_id', 'yz_cultural_space_contribution_bonus_log.uid')->on('yz_member_income.incometable_id', 'yz_cultural_space_contribution_bonus_log.id');
})
->where('yz_member_income.dividend_code',201)
->where('yz_cultural_space_contribution_bonus_log.uid',$uid)
->when($incomeStatus != 'all',function($query) use ($incomeStatus){
$query->where('yz_member_income.status',$incomeStatus == 'undrawn' ? 0 : 1);
});
}
/**
* Common: 贡献分享分红 - 分红处理开始
* Author: wu-hui
* Time: 2023/11/03 15:09
*/
public function bonusInit(){
set_time_limit(0);
DB::beginTransaction();
try{
[$startTime,$endTime] = getTimeStamp('yesterday');// yesterday 计算前一天信息
// 循环平台 进行处理
$uniAccount = UniAccount::getEnable() ?: [];
foreach ($uniAccount as $u) {
Setting::$uniqueAccountId = \YunShop::app()->uniacid = $u->uniacid;
$set = Setting::get('plugin.cultural_space_set');
// 判断:是否符合执行条件
$isRun = (boolean)$this->isRun($set,$startTime,$endTime);
// 判断:允许下一步
if ($isRun) $this->bonusHandle($set,$startTime,$endTime);
}
\Log::debug('--- 文创空间 - 贡献分享分红 - 结束 end----');
DB::commit();
}catch(\Exception $e){
\Log::debug('--- 文创空间 - 贡献分享分红 - 错误:'.$e->getMessage());
DB::rollBack();
}
}
/**
* Common: 贡献分享分红 - 判断是否允许继续执行
* Author: wu-hui
* Time: 2023/11/03 13:43
* @param $set
* @param $startTime
* @param $endTime
* @return bool
*/
private function isRun($set,$startTime,$endTime){
$time = time();
// 判断:时间上是否允许继续执行(上一个周期结束时间存在 & 当前时间小于下一个周期开始时间 禁止继续执行)
$upCycleEndTime = ContributionBonus::uniacid()->max('end_time');
$lastRunTime = strtotime(date("Y-m-d H:i:s",$upCycleEndTime)." +1 day");// 下一个周期结束时间
if($upCycleEndTime > 0 && $time < $lastRunTime) {
\Log::debug("执行时间错误(上一个周期结束时间{$upCycleEndTime},下一个周期结束时间{$lastRunTime})",\YunShop::app()->uniacid);
return false;
}
// 判断:设置是否允许执行 未开启贡献值 || 分红总额比例为0或未设置
if((int)$set['is_give_contribution'] != 1 || (float)$set['contribution_bonus_ratio'] <= 0) {
\Log::debug("未开启贡献值或者分红总额比例为0或未设置",\YunShop::app()->uniacid);
return false;
}
// 判断:是否存在分红总金额 分红总金额,仅计算参与文创空间的商品的销售额
$this->orderTotalMoney = (float)OrderGoods::uniacid()
->leftjoin('yz_order','yz_order.id','=','yz_order_goods.order_id')
->leftjoin('yz_goods_cultural_space','yz_goods_cultural_space.goods_id','=','yz_order_goods.goods_id')
->where('yz_goods_cultural_space.is_open',1)
->where('yz_order.pay_time','>=',$startTime)
->where('yz_order.pay_time','<',$endTime)
->where('yz_order.price','>',0)
->whereIn('yz_order.status',[Order::WAIT_SEND,Order::WAIT_RECEIVE,Order::COMPLETE])// 待发货、待收货、已完成
->sum('yz_order_goods.price');
// $this->orderTotalMoney = (float)Order::uniacid()
// ->where('pay_time','>=',$startTime)
// ->where('pay_time','<',$endTime)
// ->where('price','>',0)
// ->whereIn('status',[Order::WAIT_SEND,Order::WAIT_RECEIVE,Order::COMPLETE])
// ->sum('price');
$this->bonusTotalMoney = (float)sprintf("%.2f",$this->orderTotalMoney * (float)$set['contribution_bonus_ratio'] / 100);
if($this->bonusTotalMoney <= 0) {
\Log::debug("分红总金额为0",\YunShop::app()->uniacid);
return false;
}
return true;
}
/**
* Common: 贡献分享分红 - 处理每个站点所有用户的分红
* Author: wu-hui
* Time: 2023/11/03 15:09
* @param $set
* @param $startTime
* @param $endTime
* @return false|void
*/
private function bonusHandle($set,$startTime,$endTime){
// 获取贡献值信息截止昨天24时
$userList = ContributionLog::getAllList($endTime);
$totalContribution = (float)array_sum($userList);
if($totalContribution <= 0){
\Log::debug("不存在分红用户或截至当前周期结束时间总共的贡献值为0",\YunShop::app()->uniacid);
return false;
}
// 记录周期分红信息
$culturalSpaceContributionBonusId = ContributionBonus::insertGetId([
'uniacid' => \YunShop::app()->uniacid,
'order_total_money' => $this->orderTotalMoney,
'contribution_bonus_ratio' => (float)$set['contribution_bonus_ratio'],
'total_money' => $this->bonusTotalMoney,
'start_time' => $startTime,
'end_time' => $endTime,
'created_at' => time(),
]);
// 循环处理所有用户
$logInsertData = [];// 明细记录
$time = time();
$uniacid = \YunShop::app()->uniacid;
$oneLvPeople = (int)$set['one_lv_people'];
foreach($userList as $userId => $contributionValue){
// 判断:当前用户是否符合领取条件 直推多少人
if($oneLvPeople > 0){
$userNum = (int)MemberChildren::getTeamModel($userId,1)->count();
if($userNum < $oneLvPeople){
// 当前直推人数 小于 条件人数;不符合条件
continue;
}
}
// 添加贡献分享分红信息记录 这里必须进行100的偏移计算
$radio = (float)sprintf("%.2f",$contributionValue / $totalContribution * 100);// 佣金比例
$money = (float)sprintf("%.2f",$this->bonusTotalMoney * $radio / 100);// 实际获得佣金
if($money > 0){
$logInsertData[] = [
'uniacid' => $uniacid,
'uid' => $userId,
'total_money' => $this->bonusTotalMoney,
'money' => $money,
'total_contribution' => $totalContribution,
'hold_contribution' => $contributionValue,
'proportion' => $radio,
'cultural_space_contribution_bonus_id' => $culturalSpaceContributionBonusId,
'created_at' => $time,
];
}
}
self::insert($logInsertData);
}
/**
* Common: 贡献分享分红 - 结算
* Author: wu-hui
* Time: 2023/11/03 15:24
*/
public function contributionBonusSettlement(){
set_time_limit(0);
DB::beginTransaction();
try{
// 循环平台 进行处理
$uniAccount = UniAccount::getEnable() ?: [];
foreach ($uniAccount as $u) {
Setting::$uniqueAccountId = \YunShop::app()->uniacid = $u->uniacid;
// 获取未结算列表
$list = self::uniacid()
->select(['id','uid','money'])
->where('is_settlement',0)
->get()
->toArray();
if($list){
// 循环处理数据
$incomeData = [];
foreach($list as $item){
$incomeData[] = [
'uniacid' => \YunShop::app()->uniacid,
'member_id' => $item['uid'],
'amount' => $item['money'],
'detail' => '',
'dividend_table_id' => $item['id'],
'dividend_code' => IncomeService::CULTURAL_SPACE_CONTRIBUTION_BONUS,
'order_sn' => '',
];
}
IncomeService::insertIncome($incomeData);
// 修改为已经结算
$ids = array_column($list,'id');
self::whereIn('id',$ids)->update([
'is_settlement' => 1
]);
}
}
DB::commit();
}catch(\Exception $e){
\Log::debug('--- 文创空间 - 贡献分享分红结算 - 错误:'.$e->getMessage());
DB::rollBack();
}
}
/**
* Common: 一对一关联 用户信息
* Author: wu-hui
* Time: 2023/11/03 15:50
* @return \Illuminate\Database\Eloquent\Relations\HasOne
*/
public function member(){
return $this->hasOne(Member::class,'uid','uid');
}
}