添加:分销商升级条件添加购买某个商品之一升级

重构:分销商升级验证流程重构
This commit is contained in:
wuhui_zzw 2023-12-26 15:06:27 +08:00
parent 20c77494a7
commit b16c757028
6 changed files with 190 additions and 34 deletions

View File

@ -243,7 +243,7 @@ if (!function_exists('getModelTime')) {
$model->whereBetween($prefix, [date('Y-m-d H:i:s', strtotime('yesterday')), date('Y-m-d H:i:s', strtotime('today -1second'))]);
break;
case 'quarter':
list($startTime, $endTime) = getMonth();
[$startTime, $endTime] = getMonth();
$model = $model->where($prefix, '>', $startTime);
$model = $model->where($prefix, '<', $endTime);
break;
@ -255,7 +255,7 @@ if (!function_exists('getModelTime')) {
break;
default:
if (strstr($section, $field) !== false) {
list($startTime, $endTime) = explode($field, $section);
[$startTime, $endTime] = explode($field, $section);
if (strlen($startTime) == 4) {
$model->whereBetweenTime($prefix, date('Y-m-d H:i:s', strtotime($section)), date('Y-m-d H:i:s', strtotime($section . ' +1day -1second')));
} else {
@ -427,7 +427,7 @@ if (!function_exists('getStartModelTime')) {
case 'year':
return date('Y-m-d', strtotime('this year 1/1'));
case 'quarter':
list($startTime, $endTime) = getMonth();
[$startTime, $endTime] = getMonth();
return $startTime;
case 'lately7':
return date('Y-m-d', strtotime("-7 day"));
@ -435,7 +435,7 @@ if (!function_exists('getStartModelTime')) {
return date('Y-m-d', strtotime("-30 day"));
default:
if (strstr($section, '-') !== false) {
list($startTime, $endTime) = explode('-', $section);
[$startTime, $endTime] = explode('-', $section);
return date('Y-m-d H:i:s', strtotime($startTime));
}
return date('Y-m-d H:i:s');
@ -779,7 +779,7 @@ if (!function_exists('setSharePoster')) {
if (isset($config['text']) && !empty($config['text'])) {
foreach ($config['text'] as $key => $val) {
$val = array_merge($textDefault, $val);
list($R, $G, $B) = explode(',', $val['fontColor']);
[$R, $G, $B] = explode(',', $val['fontColor']);
$fontColor = imagecolorallocate($imageRes, $R, $G, $B);
$val['left'] = $val['left'] < 0 ? $backgroundWidth - abs($val['left']) : $val['left'];
$val['top'] = $val['top'] < 0 ? $backgroundHeight - abs($val['top']) : $val['top'];
@ -1233,4 +1233,17 @@ if (!function_exists('get_file_link')) {
}
}
}
/**
* Common: 下划线字符串 驼峰字符串
* Author: wu-hui
* Time: 2023/12/26 11:23
* @param $string
* @param string $separator
* @return string
*/
if (!function_exists('camelize')) {
function camelize($string,$separator = '_'){
$string = $separator. str_replace($separator, " ", strtolower($string));
return ltrim(str_replace(" ", "", ucwords($string)), $separator );
}
}

View File

@ -6,6 +6,9 @@ namespace app\common\repositories\user;
use app\common\dao\user\UserBrokerageDao;
use app\common\model\store\order\StoreOrder;
use app\common\model\store\order\StoreOrderProduct;
use app\common\model\store\product\Spu;
use app\common\model\user\User;
use app\common\model\user\UserBrokerage;
use app\common\repositories\BaseRepository;
@ -13,6 +16,7 @@ use app\common\repositories\system\CacheRepository;
use FormBuilder\Factory\Elm;
use think\exception\ValidateException;
use think\facade\Db;
use think\facade\Log;
use think\facade\Route;
/**
@ -21,6 +25,7 @@ use think\facade\Route;
class UserBrokerageRepository extends BaseRepository
{
// 基本升级条件 所有内容走基本升级条件流程统一处理,未添加到该数组中的升级条件为特殊升级条件,全部单独处理
public const BROKERAGE_RULE_TYPE = ['spread_user', 'pay_money', 'pay_num', 'spread_money', 'spread_pay_num'];
public function __construct(UserBrokerageDao $dao)
@ -51,6 +56,7 @@ class UserBrokerageRepository extends BaseRepository
return $this->dao->search(['type' => $type])->order('brokerage_level ASC,create_time DESC')->select();
}
public function inc(User $user, $type, $inc)
{
$nextLevel = $this->getNextLevel($user->brokerage_level);
@ -72,7 +78,6 @@ class UserBrokerageRepository extends BaseRepository
return $this->checkLevel($user, $nextLevel);
}
public function checkLevel(User $user, UserBrokerage $nextLevel)
{
$info = app()->make(UserBillRepository::class)->search(['uid' => $user->uid, 'category' => 'sys_brokerage', 'link_id' => $nextLevel->user_brokerage_id])
@ -96,6 +101,125 @@ class UserBrokerageRepository extends BaseRepository
});
return true;
}
/**
* Common: 分销商升级 - 流程开始
* Author: wu-hui
* Time: 2023/12/26 14:20
* @param User $user
* @param $data
* @return bool|void
*/
public function incV2(User $user, $data){
$type = $data['type'] ?? '';
$inc = $data['inc'] ?? 0;
// 判断:不存在下一级 升级失败
$nextLevel = $this->getNextLevel($user->brokerage_level);
if (!$nextLevel) return false;
// 判断:是否为基本升级条件 是则进行统一账单处理
if(in_array($type,self::BROKERAGE_RULE_TYPE)){
$make = app()->make(UserBillRepository::class);
$bill = $make->getWhere(['uid' => $user->uid, 'link_id' => $nextLevel->user_brokerage_id, 'category' => 'sys_brokerage', 'type' => $type]);
if ($bill) {
$bill->number = bcadd($bill->number, $inc, 2);
$bill->save();
} else {
$make->incBill($user->uid, 'sys_brokerage', $type, [
'number' => $inc,
'title' => $type,
'balance' => 0,
'status' => 0,
'link_id' => $nextLevel->user_brokerage_id
]);
}
}
// 升级判断流程开始
return $this->checkLevelV2($user, $nextLevel, $data);
}
/**
* Common: 分销商升级 - 升级判断及修改等级信息
* Author: wu-hui
* Time: 2023/12/26 14:20
* @param User $user
* @param UserBrokerage $nextLevel
* @param $data
* @return bool|void
*/
public function checkLevelV2(User $user, UserBrokerage $nextLevel, $data){
// 分销商升级条件判断
try{
// 循环判断是否达成所有升级条件 全部达成为true-成功升级未全部达成为false-升级失败;为空则未设置升级条件-不允许升级
$info = app()->make(UserBillRepository::class)->search(['uid' => $user->uid, 'category' => 'sys_brokerage', 'link_id' => $nextLevel->user_brokerage_id])->column('number', 'type');
$completeResult = [];// 每个条件达成情况:达成=true未达成=false未开启=空
foreach ($nextLevel['brokerage_rule'] as $upgradeKey => $rule) {
// 是否开启
if($rule['is_open'] != 1) continue;
// 根据类型进行对应的处理
if(in_array($upgradeKey,self::BROKERAGE_RULE_TYPE)){
// 基本升级条件 统一处理
if((float)$rule['num'] <= 0) continue;// 条件无效
// 判断:条件是否达标
$num = $info[$upgradeKey] ?? 0;
$completeResult[$upgradeKey] = (float)$rule['num'] >= (float)$num;
}else{
// 特殊升级条件 全部单独处理
$funName = 'upgradeJudge'.ucfirst(camelize($upgradeKey));
$judgeResult = $this->$funName($rule,$data);
if(gettype($judgeResult) == 'boolean') $completeResult[$upgradeKey] = $judgeResult;
}
}
// 判断:是否成功升级
if(array_sum($completeResult) != count($completeResult)) return false;// 结果为空,无有效升级条件;禁止升级
// 升级成功
$nextLevel->user_num++;
Db::transaction(function () use ($nextLevel, $user) {
$nextLevel->save();
if ($user->brokerage && $user->brokerage->user_num > 0) {
$user->brokerage->user_num--;
$user->brokerage->save();
}
// 不是推广员 开启推广员身份
if((int)$user->is_promoter != 1){
$user->is_promoter = 1;
$user->promoter_time = date('Y-m-d H:i:s');
}
$user->brokerage_level = $nextLevel->brokerage_level;
$user->save();
$key = 'notice_brokerage_level_' . $user->uid;
app()->make(CacheRepository::class)->save($key,$nextLevel->brokerage_level);
});
return true;
}catch(\Exception $e){
Log::info('分销商升级 - 错误: '.var_export([
'uid' => $user->uid,
'type' => $data['type'],
'msg' => $e->getMessage(),
],1));
}
}
/**
* Common: 分销商升级 - 升级条件判断 - 购买某个商品之一
* Author: wu-hui
* Time: 2023/12/26 14:35
* @param $rule
* @param $data
* @return bool|string
*/
private function upgradeJudgeManyGoods($rule,$data){
// 判断:条件是否有效
if(count($rule['ids']) <= 0) return '';// 条件无效 未设置商品
// 判断:是否存在订单信息 不存在直接返回false
if(!array_key_exists('group_order_id',$data)) return false;
// 处理订单信息
$orderIds = StoreOrder::where('group_order_id',$data['group_order_id'])->column('order_id');// 获取订单id
$productIds = StoreOrderProduct::whereIn('order_id',$orderIds)->column('product_id');// 获取当前订单中所有商品ID
$setNeedProductIds = Spu::whereIn('spu_id',$rule['ids'])->column('product_id');// 设置的需求商品ID
$intersectData = array_intersect($productIds,$setNeedProductIds);
return count($intersectData) > 0;
}
public function getLevelRate(User $user, UserBrokerage $nextLevel)
{

View File

@ -6,9 +6,11 @@
namespace app\controller\api;
use app\common\repositories\store\order\StoreGroupOrderRepository;
use app\common\repositories\store\order\StoreOrderRepository;
use app\common\repositories\store\order\StoreRefundOrderRepository;
use app\common\repositories\system\notice\SystemNoticeConfigRepository;
use app\common\repositories\user\UserBrokerageRepository;
use app\common\repositories\user\UserRepository;
use app\common\repositories\user\UserSignRepository;
use app\common\repositories\wechat\RoutineQrcodeRepository;
@ -16,6 +18,7 @@ use app\common\repositories\wechat\WechatUserRepository;
use app\validate\api\ChangePasswordValidate;
use app\validate\api\UserAuthValidate;
use crmeb\basic\BaseController;
use crmeb\jobs\UserBrokerageLevelJob;
use crmeb\services\MiniProgramService;
use crmeb\services\SmsService;
use crmeb\services\WechatService;
@ -43,8 +46,7 @@ use crmeb\jobs\SendSmsJob;
*/
class Auth extends BaseController
{
public function test()
{
public function test(){
// $data = [
// 'tempId' => '',
// 'id' => '',
@ -60,6 +62,20 @@ class Auth extends BaseController
// if ($status['notice_routine'] == 1) {
// app()->make(WechatTemplateMessageService::class)->subscribeSendTemplate($data);
// }
// 分销商升级模拟
// $user = app()->make(UserRepository::class)->get(327706);
// $res = app()->make(UserBrokerageRepository::class)->incV2($user, [
// 'type' => 'pay_num',
// 'inc' => 0
// ]);
// debug(['升级结果'=>$res]);
}
/**
@ -225,7 +241,7 @@ class Auth extends BaseController
*/
public function mpAuth()
{
list($code, $post_cache_key) = $this->request->params([
[$code, $post_cache_key] = $this->request->params([
'code',
'cache_key',
], true);
@ -506,7 +522,7 @@ class Auth extends BaseController
if (count($tks) != 3) {
throw new ValidateException('Wrong number of segments');
}
list($headb64, $bodyb64, $cryptob64) = $tks;
[$headb64, $bodyb64, $cryptob64] = $tks;
if (null === ($payload = JWT::jsonDecode(JWT::urlsafeB64Decode($bodyb64)))) {
throw new ValidateException('Invalid header encoding');
}

View File

@ -5,7 +5,9 @@ namespace app\listener\platformCommission;
use app\common\model\store\platformCommission\Record;
use app\common\model\system\merchant\Merchant;
use app\common\repositories\store\platformCommission\RecordRepository;
use crmeb\jobs\UserBrokerageLevelJob;
use think\facade\Log;
use think\facade\Queue;
class OrderPaySuccessEvent{
public $groupOrder;
@ -13,8 +15,14 @@ class OrderPaySuccessEvent{
public function handle($groupOrder){
$groupOrder = $groupOrder['groupOrder'];
Log::info('支付成功 - 平台抽成处理 - 开始: '.var_export(['uid'=>$groupOrder->uid,'group_order_id'=>$groupOrder->group_order_id],1));
$this->orderPaySuccessHandle($groupOrder);
// 订单支付成功 触发购买商品升级
Queue::push(UserBrokerageLevelJob::class,[
'uid' => $groupOrder->uid,
'type' => 'many_goods',
'inc' => 0,
'group_order_id' => $groupOrder->group_order_id
]);
}
/**
* Common: 支付成功 - 平台抽成处理

View File

@ -15,31 +15,31 @@ class UserBrokerageValidate extends Validate
protected $rule = [
'brokerage_level|会员等级' => 'require|integer|>:0',
'brokerage_name|会员名称' => 'require|max:16',
'brokerage_icon|会员图标' => 'require',
'brokerage_rule|会员升级规则' => 'requireIf:type,0|array|checkBrokerageRule',
// 'brokerage_icon|会员图标' => 'require',
'brokerage_rule|会员升级规则' => 'requireIf:type,0|array',// checkBrokerageRule todo: 取消升级条件验证 如果不存在升级条件则不允许升级到该等级
'extension_one|一级佣金比例' => 'requireIf:type,0|float|>=:0|<=:100',
'extension_two|二级佣金比例' => 'requireIf:type,0|float|>=:0|<=:100',
'image|背景图' => 'requireIf:type,1|max:128',
'value|会员成长值' => 'requireIf:type,1|float|>=:0',
'type|类型' => 'require|in:0,1',
];
// todo 2023-12-25 重构升级条件,这里的验证不在使用 因此未修改验证内容,这里的验证已失效
public function checkBrokerageRule($value, $rlue, $data){
public function checkBrokerageRule($value, $rlue, $data)
{
if (!$data['type']) {
// 基本升级条件:不在列表中的升级条件,不进行统一升级条件判断
$types = UserBrokerageRepository::BROKERAGE_RULE_TYPE;
if (count($types) != count($value)) {
return '请输入正确的升级任务';
}
// if (count($types) != count($value)) return '升级任务设置错误';
$flag = 0;
foreach ($types as $type) {
$val = $value[$type] ?? '';
if (!is_array($val) || !isset($val['name'], $val['num'], $val['info']) || count($val) != 3) return '请输入正确的升级任务';
if ($val['num'] < 0)
return '请输入正确的任务数量';
if ($val['num'] < 0) return '请输入正确的任务数量';
if ($val['num'] > 0 && !$val['name']) return '请输入任务名称';
if ($val['num'] > 0) $flag++;
}
if (!$flag) return '请至少设置一个升级任务';
}

View File

@ -18,20 +18,15 @@ class UserBrokerageLevelJob implements JobInterface
try {
$user = app()->make(UserRepository::class)->get($data['uid']);
if ($user) {
// 修改用户信息
$flag = true;
if ($data['type'] == 'spread_money') {
$user->spread_pay_price = bcadd($user->spread_pay_price, $data['inc'], 2);
} else if ($data['type'] == 'spread_pay_num') {
$user->spread_pay_count = bcadd($user->spread_pay_count, $data['inc'], 0);
} else {
$flag = false;
}
if ($flag) {
$user->save();
}
}
if ($user && $user->is_promoter) {
app()->make(UserBrokerageRepository::class)->inc($user, $data['type'], $data['inc']);
if ($data['type'] == 'spread_money') $user->spread_pay_price = bcadd($user->spread_pay_price, $data['inc'], 2);
else if ($data['type'] == 'spread_pay_num') $user->spread_pay_count = bcadd($user->spread_pay_count, $data['inc'], 0);
else $flag = false;
if ($flag) $user->save();
// todo 2023-12-25 分销商升级重构 旧版本弃用改为使用v2版本升级流程
// app()->make(UserBrokerageRepository::class)->inc($user, $data);
app()->make(UserBrokerageRepository::class)->incV2($user, $data);
}
} catch (\Exception $e) {
Log::info('分销等级同步失败: ' . var_export($data, 1) . $e->getMessage());