From b16c7570281d32393fcacfdc4a9db9fe23da305f Mon Sep 17 00:00:00 2001 From: wuhui_zzw <1760308791@qq.com> Date: Tue, 26 Dec 2023 15:06:27 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=9A=E5=88=86=E9=94=80?= =?UTF-8?q?=E5=95=86=E5=8D=87=E7=BA=A7=E6=9D=A1=E4=BB=B6=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E8=B4=AD=E4=B9=B0=E6=9F=90=E4=B8=AA=E5=95=86=E5=93=81=E4=B9=8B?= =?UTF-8?q?=E4=B8=80=E5=8D=87=E7=BA=A7=20=E9=87=8D=E6=9E=84=EF=BC=9A?= =?UTF-8?q?=E5=88=86=E9=94=80=E5=95=86=E5=8D=87=E7=BA=A7=E9=AA=8C=E8=AF=81?= =?UTF-8?q?=E6=B5=81=E7=A8=8B=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/common.php | 25 +++- .../user/UserBrokerageRepository.php | 126 +++++++++++++++++- app/controller/api/Auth.php | 24 +++- .../OrderPaySuccessEvent.php | 10 +- app/validate/admin/UserBrokerageValidate.php | 18 +-- crmeb/jobs/UserBrokerageLevelJob.php | 21 ++- 6 files changed, 190 insertions(+), 34 deletions(-) diff --git a/app/common.php b/app/common.php index 7b3801f..d39c21e 100644 --- a/app/common.php +++ b/app/common.php @@ -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 ); + } +} diff --git a/app/common/repositories/user/UserBrokerageRepository.php b/app/common/repositories/user/UserBrokerageRepository.php index 714b2b4..5d4ccc3 100644 --- a/app/common/repositories/user/UserBrokerageRepository.php +++ b/app/common/repositories/user/UserBrokerageRepository.php @@ -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) { diff --git a/app/controller/api/Auth.php b/app/controller/api/Auth.php index c2c6e7b..0f4ef67 100644 --- a/app/controller/api/Auth.php +++ b/app/controller/api/Auth.php @@ -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'); } diff --git a/app/listener/platformCommission/OrderPaySuccessEvent.php b/app/listener/platformCommission/OrderPaySuccessEvent.php index b43d0e9..f710b6c 100644 --- a/app/listener/platformCommission/OrderPaySuccessEvent.php +++ b/app/listener/platformCommission/OrderPaySuccessEvent.php @@ -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: 支付成功 - 平台抽成处理 diff --git a/app/validate/admin/UserBrokerageValidate.php b/app/validate/admin/UserBrokerageValidate.php index 158bfa0..2dbedaa 100644 --- a/app/validate/admin/UserBrokerageValidate.php +++ b/app/validate/admin/UserBrokerageValidate.php @@ -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 '请至少设置一个升级任务'; } diff --git a/crmeb/jobs/UserBrokerageLevelJob.php b/crmeb/jobs/UserBrokerageLevelJob.php index 80fa311..b0c9da8 100644 --- a/crmeb/jobs/UserBrokerageLevelJob.php +++ b/crmeb/jobs/UserBrokerageLevelJob.php @@ -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());