495 lines
16 KiB
PHP
495 lines
16 KiB
PHP
<?php
|
|
namespace app\admin\logic\distribution;
|
|
|
|
use app\common\basics\Logic;
|
|
use app\common\model\distribution\Distribution;
|
|
use app\common\model\distribution\DistributionGoods;
|
|
use app\common\model\distribution\DistributionLevel;
|
|
use app\common\model\distribution\DistributionLevelUpdate;
|
|
use app\common\model\distribution\DistributionOrderGoods;
|
|
use app\common\model\order\Order;
|
|
use app\common\model\order\OrderTrade;
|
|
use think\facade\Db;
|
|
|
|
class DistributionLevelLogic extends Logic
|
|
{
|
|
/**
|
|
* @notes 分销等级列表
|
|
* @return array
|
|
* @throws \think\db\exception\DataNotFoundException
|
|
* @throws \think\db\exception\DbException
|
|
* @throws \think\db\exception\ModelNotFoundException
|
|
* @author Tab
|
|
* @date 2021/9/1 16:19
|
|
*/
|
|
public static function index()
|
|
{
|
|
$field = [
|
|
'id',
|
|
'name',
|
|
'weights' => 'weights_desc',
|
|
'first_ratio',
|
|
'second_ratio',
|
|
'is_default',
|
|
'id' => 'members_num'
|
|
];
|
|
$lists = DistributionLevel::field($field)
|
|
->order('weights', 'asc')
|
|
->select()
|
|
->toArray();
|
|
|
|
$count = DistributionLevel::count();
|
|
|
|
return [
|
|
'count' => $count,
|
|
'lists' => $lists,
|
|
];
|
|
}
|
|
|
|
/**
|
|
* @notes 添加分销会员等级
|
|
* @param $params
|
|
* @return bool
|
|
* @author Tab
|
|
* @date 2021/9/1 14:53
|
|
*/
|
|
public static function add($params)
|
|
{
|
|
Db::startTrans();
|
|
try{
|
|
// 写入等级主表
|
|
$params['remark'] = $params['remark'] ?? '';
|
|
$newLevel = DistributionLevel::create($params);
|
|
|
|
// 写入升级条件表
|
|
self::addUpdateCondition($params, $newLevel->id);
|
|
|
|
// 处理分销商品比例
|
|
self::updateDistributionGoods($newLevel->id);
|
|
|
|
Db::commit();
|
|
return true;
|
|
}catch(\Exception $e) {
|
|
Db::rollback();
|
|
self::$error = $e->getMessage();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @notes 添加更新升级条件
|
|
* @param $params
|
|
* @param $level_id
|
|
* @throws \Exception
|
|
* @author Tab
|
|
* @date 2021/9/1 15:08
|
|
*/
|
|
public static function addUpdateCondition($params, $level_id)
|
|
{
|
|
$updateConditionData = [];
|
|
foreach($params['update_condition'] as $key) {
|
|
// 判断是否在规定的条件字段
|
|
if(!in_array($key, DistributionLevel::UPDATE_CONDITION_FIELDS, true)) {
|
|
continue;
|
|
}
|
|
if ($params[$key] < 0) {
|
|
throw new \Exception('升级条件不允许小于0');
|
|
}
|
|
// 获取键对应值的字段名
|
|
$valueField = DistributionLevel::getValueFiled($key);
|
|
$updateConditionData[] = [
|
|
'level_id' => $level_id,
|
|
'key' => $key,
|
|
$valueField => $params[$key]
|
|
];
|
|
}
|
|
(new DistributionLevelUpdate())->saveAll($updateConditionData);
|
|
}
|
|
|
|
/**
|
|
* @notes 获取分销等级详情
|
|
* @param $params
|
|
* @return array
|
|
* @author Tab
|
|
* @date 2021/9/1 15:36
|
|
*/
|
|
public static function detail($params)
|
|
{
|
|
$level = DistributionLevel::withoutField('create_time,update_time,delete_time')->findOrEmpty($params['id']);
|
|
if($level->isEmpty()) {
|
|
return [];
|
|
}
|
|
$level = $level->toArray();
|
|
// 默认等级
|
|
if($level['is_default']) {
|
|
unset($level['self_ratio']);
|
|
unset($level['third_ratio']);
|
|
unset($level['update_relation']);
|
|
return $level;
|
|
}
|
|
// 自定义等级
|
|
$level['update_condition'] = self::getUpdateCondition($level);
|
|
unset($level['self_ratio']);
|
|
unset($level['third_ratio']);
|
|
|
|
return $level;
|
|
}
|
|
|
|
/**
|
|
* @notes 获取升级条件
|
|
* @param $level
|
|
* @return array
|
|
* @author Tab
|
|
* @date 2021/9/1 15:36
|
|
*/
|
|
public static function getUpdateCondition($level)
|
|
{
|
|
$updateCondition = DistributionLevelUpdate::where('level_id', $level['id'])->column('key,value_int,value_decimal,value_text');
|
|
$updateConditionData = [];
|
|
foreach($updateCondition as $item) {
|
|
if($item['value_int']) {
|
|
$updateConditionData[$item['key']] = $item['value_int'];
|
|
continue;
|
|
}
|
|
if($item['value_decimal']) {
|
|
$updateConditionData[$item['key']] = $item['value_decimal'];
|
|
continue;
|
|
}
|
|
if($item['value_text']) {
|
|
$updateConditionData[$item['key']] = $item['value_text'];
|
|
continue;
|
|
}
|
|
}
|
|
$data = [
|
|
'keys' => array_keys($updateConditionData),
|
|
'data' => $updateConditionData
|
|
];
|
|
// 补全条件
|
|
foreach(DistributionLevel::UPDATE_CONDITION_FIELDS as $field) {
|
|
if(!isset($data['data'][$field])) {
|
|
$data['data'][$field] = '';
|
|
}
|
|
}
|
|
return $data;
|
|
}
|
|
|
|
/**
|
|
* @notes 编辑分销等级
|
|
* @param $params
|
|
* @return bool
|
|
* @author Tab
|
|
* @date 2021/9/1 16:20
|
|
*/
|
|
public static function edit($params)
|
|
{
|
|
Db::startTrans();
|
|
try{
|
|
$params['remark'] = $params['remark'] ?? '';
|
|
$level = DistributionLevel::findOrEmpty($params['id']);
|
|
if($level->isEmpty()) {
|
|
throw new \Exception('等级不存在');
|
|
}
|
|
// 默认等级
|
|
if($level->is_default) {
|
|
$level->allowField(['name', 'first_ratio', 'second_ratio','remark'])->save($params);
|
|
Db::commit();
|
|
return true;
|
|
}
|
|
// 自定义等级 - 更新主表信息
|
|
if(!$params['weights'] > 1) {
|
|
throw new \Exception('级别须大于1');
|
|
}
|
|
if(!isset($params['update_relation'])) {
|
|
throw new \Exception('请选择升级关系');
|
|
}
|
|
if(!isset($params['update_condition']) || !count($params['update_condition'])) {
|
|
throw new \Exception('请选择升级条件');
|
|
}
|
|
$level->allowField(['name', 'weights', 'first_ratio', 'second_ratio','remark', 'update_relation'])->save($params);
|
|
|
|
// 自定义等级 - 删除旧升级条件
|
|
$deleteIds = DistributionLevelUpdate::where('level_id', $level->id)->column('id');
|
|
DistributionLevelUpdate::destroy($deleteIds);
|
|
|
|
// 自定义等级 - 添加新的升级条件
|
|
self::addUpdateCondition($params, $level->id);
|
|
|
|
Db::commit();
|
|
return true;
|
|
}catch(\Exception $e) {
|
|
Db::rollback();
|
|
self::$error = $e->getMessage();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @notes 删除分销等级
|
|
* @param $params
|
|
* @return bool
|
|
* @author Tab
|
|
* @date 2021/9/1 16:21
|
|
*/
|
|
public static function delete($params)
|
|
{
|
|
Db::startTrans();
|
|
try{
|
|
$level = DistributionLevel::findOrEmpty($params['id']);
|
|
if($level->isEmpty()) {
|
|
throw new \Exception('等级不存在');
|
|
}
|
|
if($level->is_default) {
|
|
throw new \Exception('系统默认等级不允许删除');
|
|
}
|
|
|
|
// 重置该等级下的分销会员为系统默认等级
|
|
$defaultId = DistributionLevel::where('is_default', 1)->value('id');
|
|
Distribution::where('level_id', $level->id)->update(['level_id' => $defaultId]);
|
|
|
|
// 删除升级条件
|
|
$deleteIds = DistributionLevelUpdate::where('level_id', $level->id)->column('id');
|
|
DistributionLevelUpdate::destroy($deleteIds);
|
|
|
|
// 删除该等级下的分销商品比例
|
|
$deleteIds = DistributionGoods::where('level_id', $level->id)->column('id');
|
|
DistributionGoods::destroy($deleteIds);
|
|
|
|
// 删除等级
|
|
$level->delete();
|
|
|
|
Db::commit();
|
|
return true;
|
|
}catch(\Exception $e) {
|
|
Db::rollback();
|
|
self::$error = $e->getMessage();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @notes 更新分销会员等级
|
|
* @param $userId
|
|
* @return false
|
|
* @author Tab
|
|
* @date 2021/9/2 16:39
|
|
*/
|
|
public static function updateDistributionLevel($userId)
|
|
{
|
|
// 非默认等级
|
|
$levels = DistributionLevel::where('is_default', 0)
|
|
->order('weights', 'desc')
|
|
->column('id,name,weights,update_relation', 'id');
|
|
|
|
$userInfo = Distribution::alias('d')
|
|
->leftJoin('distribution_level dl', 'dl.id = d.level_id')
|
|
->field('d.is_distribution,d.level_id,dl.weights')
|
|
->where('d.user_id', $userId)
|
|
->findOrEmpty()
|
|
->toArray();
|
|
|
|
// 非分销会员直接返回false
|
|
if(empty($userInfo) || !$userInfo['is_distribution']) {
|
|
return false;
|
|
}
|
|
|
|
foreach($levels as $level) {
|
|
if(self::isMeetConditions($userId, $level) && $level['weights'] > $userInfo['weights']) {
|
|
// 满足升级条件且是升更高的等级
|
|
Distribution::where(['user_id' => $userId])->update(['level_id' => $level['id']]);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @notes 判断是否满足当前等级的升级条件
|
|
* @param $userId
|
|
* @param $level
|
|
* @return bool
|
|
* @author Tab
|
|
* @date 2021/9/2 16:42
|
|
*/
|
|
public static function isMeetConditions($userId, $level)
|
|
{
|
|
// 任一条件满足升级
|
|
if($level['update_relation'] == 1) {
|
|
$flagOr = self::singleConsumptionAmountFlag($userId, $level) || self::cumulativeConsumptionAmountFlag($userId, $level) || self::cumulativeConsumptionTimesFlag($userId, $level) || self::returnedCommissionFlag($userId, $level);
|
|
return $flagOr;
|
|
}
|
|
|
|
// 全部条件满足升级
|
|
if($level['update_relation'] == 2) {
|
|
$flagAnd = self::singleConsumptionAmountFlag($userId, $level) && self::cumulativeConsumptionAmountFlag($userId, $level) && self::cumulativeConsumptionTimesFlag($userId, $level) && self::returnedCommissionFlag($userId, $level);
|
|
return $flagAnd;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @notes 判断是否满足单笔消费金额条件
|
|
* @param $userId
|
|
* @param $level
|
|
* @return bool
|
|
* @author Tab
|
|
* @date 2021/9/2 16:44
|
|
*/
|
|
public static function singleConsumptionAmountFlag($userId, $level)
|
|
{
|
|
$condition = DistributionLevelUpdate::field('value_int,value_decimal,value_text')
|
|
->where([
|
|
'level_id' => $level['id'],
|
|
'key' => 'singleConsumptionAmount'
|
|
])
|
|
->findOrEmpty();
|
|
if($condition->isEmpty()) {
|
|
// 没有该条件代表无需判断,直接返回true
|
|
return true;
|
|
}
|
|
$recentOrder = Order::where([
|
|
'user_id' => $userId,
|
|
'pay_status' => 1
|
|
])
|
|
->order('id', 'desc')
|
|
->findOrEmpty();
|
|
if($recentOrder->isEmpty()) {
|
|
return false;
|
|
}
|
|
$singleConsumptionAmount = OrderTrade::where('id', $recentOrder['trade_id'])->findOrEmpty()->toArray();
|
|
if($singleConsumptionAmount['order_amount'] >= $condition['value_decimal']) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @notes 判断是否满足累计消费金额条件
|
|
* @param $userId
|
|
* @param $level
|
|
* @return bool
|
|
* @author Tab
|
|
* @date 2021/9/2 16:50
|
|
*/
|
|
public static function cumulativeConsumptionAmountFlag($userId, $level)
|
|
{
|
|
$condition = DistributionLevelUpdate::field('value_int,value_decimal,value_text')
|
|
->where([
|
|
'level_id' => $level['id'],
|
|
'key' => 'cumulativeConsumptionAmount'
|
|
])
|
|
->findOrEmpty();
|
|
if($condition->isEmpty()) {
|
|
// 没有该条件代表无需判断,直接返回true
|
|
return true;
|
|
}
|
|
$cumulativeConsumptionAmount = Order::where([
|
|
'user_id' => $userId,
|
|
'pay_status' => 1
|
|
])->sum('order_amount');
|
|
if($cumulativeConsumptionAmount >= $condition['value_decimal']) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @notes 判断是否满足累计消费次数条件
|
|
* @param $userId
|
|
* @param $level
|
|
* @return bool
|
|
* @author Tab
|
|
* @date 2021/9/2 16:53
|
|
*/
|
|
public static function cumulativeConsumptionTimesFlag($userId, $level)
|
|
{
|
|
$condition = DistributionLevelUpdate::field('value_int,value_decimal,value_text')
|
|
->where([
|
|
'level_id' => $level['id'],
|
|
'key' => 'cumulativeConsumptionTimes'
|
|
])
|
|
->findOrEmpty();
|
|
if($condition->isEmpty()) {
|
|
// 没有该条件代表无需判断,直接返回true
|
|
return true;
|
|
}
|
|
$allTradeIds = Order::where([
|
|
'user_id' => $userId,
|
|
'pay_status' => 1
|
|
])->column('trade_id');
|
|
$cumulativeConsumptionTimes = count(array_unique($allTradeIds));
|
|
if($cumulativeConsumptionTimes >= $condition['value_int']) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @notes 判断是否消费已返佣金条件
|
|
* @param $userId
|
|
* @param $level
|
|
* @return bool
|
|
* @author Tab
|
|
* @date 2021/9/2 17:06
|
|
*/
|
|
public static function returnedCommissionFlag($userId, $level)
|
|
{
|
|
$condition = DistributionLevelUpdate::field('value_int,value_decimal,value_text')
|
|
->where([
|
|
'level_id' => $level['id'],
|
|
'key' => 'returnedCommission'
|
|
])
|
|
->findOrEmpty();
|
|
if($condition->isEmpty()) {
|
|
// 没有该条件代表无需判断,直接返回true
|
|
return true;
|
|
}
|
|
$returnedCommission = DistributionOrderGoods::where([
|
|
'user_id' => $userId,
|
|
'status' => 2
|
|
])->sum('money');
|
|
if($returnedCommission >= $condition['value_decimal']) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @notes 获取所有分销会员等级
|
|
* @return array
|
|
* @author Tab
|
|
* @date 2021/9/2 18:31
|
|
*/
|
|
public static function getLevels()
|
|
{
|
|
return DistributionLevel::order('weights', 'asc')->column('id, name,weights');
|
|
}
|
|
|
|
/**
|
|
* @notes 更新分销商品比例
|
|
* @param $levelId
|
|
* @author Tab
|
|
* @date 2021/9/7 17:27
|
|
*/
|
|
public static function updateDistributionGoods($levelId)
|
|
{
|
|
// 处理单独设置比例的商品,新增分销会等级佣金比例初始化为0
|
|
$field = [
|
|
'shop_id',
|
|
'goods_id',
|
|
'item_id',
|
|
];
|
|
$distribution = DistributionGoods::distinct(true)->field($field)->where('rule', 2)->select()->toArray();
|
|
$addData = [];
|
|
foreach($distribution as $item) {
|
|
$temp = [
|
|
'shop_id' => $item['shop_id'],
|
|
'goods_id' => $item['goods_id'],
|
|
'item_id' => $item['item_id'],
|
|
'level_id' => $levelId,
|
|
'first_ratio' => 0,
|
|
'second_ratio' => 0,
|
|
'rule' => 2,
|
|
];
|
|
$addData[] = $temp;
|
|
}
|
|
(new DistributionGoods())->saveAll($addData);
|
|
}
|
|
} |