| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342 |
- <?php
- /**
- * 奖励服务模块
- * @author wesmiler
- */
- namespace app\weixin\service;
- use app\weixin\model\AccountLog;
- use app\weixin\model\Market;
- use app\weixin\model\Member;
- use app\weixin\model\UserBalanceLog;
- use app\weixin\model\Wechat;
- use think\Db;
- class Award
- {
- /**
- * 分享邀请用户奖励结算
- * @param $userId
- * @param array $regUserInfo
- * @return array|false
- * @throws \think\Exception
- * @throws \think\db\exception\DataNotFoundException
- * @throws \think\db\exception\ModelNotFoundException
- * @throws \think\exception\DbException
- * @throws \think\exception\PDOException
- */
- public static function inviteUser($userId, $regUserInfo = [])
- {
- $userInfo = Member::where(['id' => $userId, 'user_status' => 1])
- ->field('id,user_login,user_nickname,openid,redheart')
- ->find();
- $inviteOpenid = isset($userInfo['openid']) ? $userInfo['openid'] : '';
- $inviteNickname = isset($userInfo['user_nickname']) ? $userInfo['user_nickname'] : '';
- $redheart = isset($userInfo['redheart']) ? floatval($userInfo['redheart']) : 0;
- if (empty($userInfo)) {
- return false;
- }
- $siteInfo = cmf_get_site_info();
- $awardNum = isset($siteInfo['invite_award_redheart']) ? intval($siteInfo['invite_award_redheart']) : 0;
- if ($awardNum > 0) {
- // 奖励入账
- Member::where(['id' => $userId])->update(['redheart' => moneyFormat($redheart + $awardNum), 'updated_at' => date('Y-m-d H:i:s')]);
- // 账户明细
- $dateTime = date('Y-m-d H:i:s');
- $regNickname = isset($regUserInfo['user_nickname']) ? $regUserInfo['user_nickname'] : '';
- $regUserId = isset($regUserInfo['id']) ? $regUserInfo['id'] : '';
- $logData = [
- 'user_id' => $userId,
- 'type' => 4,
- 'account_type' => 1,
- 'change_type' => 1,
- 'money' => $awardNum,
- 'balance' => $redheart,
- 'remark' => "邀请用户[$regUserId],昵称[{$regNickname}]完成注册奖励",
- 'created_at' => $dateTime,
- ];
- db('account_log')->insertGetId($logData);
- // 推送消息
- $message = [];
- $pushInvite = isset($siteInfo['push_invite']) ? $siteInfo['push_invite'] : true;
- if ($inviteOpenid && $pushInvite) {
- $siteName = isset($siteInfo['site_name']) ? $siteInfo['site_name'] : '本公众号';
- $inviteMsg = isset($siteInfo['invite_msg']) ? $siteInfo['invite_msg'] : '';
- $match = ['{nickname}', '{inviteNickname}', '{awardNum}', '{datetime}', '{date}'];
- $data = [$regNickname, $inviteNickname, $awardNum, $dateTime, date('Y.m.d')];
- $inviteMsg = $inviteMsg ? str_replace($match, $data, $inviteMsg) : "尊敬的【{$inviteNickname}】,您在{$dateTime}成功邀请了用户{$regNickname}关注{$siteName},获得奖励{$awardNum}颗爱心!!!";
- $message = ['content' => $inviteMsg];
- }
- return ['openid' => $inviteOpenid, 'message' => $message];
- }
- return false;
- }
- /**
- * 分销收益奖励结算
- * @param $userId 当前奖励用户ID
- * @param $sourceUid 当前收益直接来源用户ID
- * @param $type 收益类型:对应market表ID
- * @param int $money 结算金额:比例分成必传金额
- * @return bool
- * @throws \think\Exception
- * @throws \think\db\exception\DataNotFoundException
- * @throws \think\db\exception\ModelNotFoundException
- * @throws \think\exception\DbException
- */
- public static function marketAward($userId, $sourceUid, $type, $money=0)
- {
- if (empty($type) || $userId <= 0 || ($userId == $sourceUid)) {
- return false;
- }
- // 分销参数配置
- $cacheKey = "market:award:u_{$userId}_{$sourceUid}_{$type}";
- $logData = ['money' => $money, 'sourceUid' => $sourceUid, 'userId'=> $userId];
- // 验证上级用户是否符合奖励条件
- $where = ['id' => $userId, 'agent_type' => 1, 'agent_status' => 1];
- $field = 'id,openid,user_nickname,parent_id,user_login,shop_type,balance,create_time';
- $userInfo = Member::getInfo($where, $field);
- $nickname = isset($userInfo['user_nickname']) ? trim($userInfo['user_nickname']) : '';
- $userLogin = isset($userInfo['user_login']) ? trim($userInfo['user_login']) : '';
- $balance = isset($userInfo['balance']) ? floatval($userInfo['balance']) : 0;
- $nickname = $nickname? $nickname : formatName($userLogin);
- $logData['userInfo'] = $userInfo;
- if (empty($userInfo)) {
- $logData['error'] = '审核用户信息不存在';
- PRedis::set("{$cacheKey}:error_user", $logData, 7200);
- return false;
- }
- // 按类型获取分销配置
- $shopType = isset($userInfo['shop_type'])? $userInfo['shop_type'] : 0;
- $marketConfig = Market::where(['id' => $type, 'status' => 1,'shop_type'=> $shopType])->find();
- $marketType = isset($marketConfig['type']) ? $marketConfig['type'] : 2;
- $logData['config'] = $marketConfig;
- if (empty($marketConfig)) {
- PRedis::set("{$cacheKey}:error_config", $logData, 7200);
- return false;
- }
- // 收益原始来源用户
- $sWhere = ['id' => $sourceUid, 'user_type' => 2];
- $sourceInfo = Member::getInfo($sWhere, $field);
- $sourceNickname = isset($sourceInfo['user_nickname']) ? $sourceInfo['user_nickname'] : '';
- $userLogin = isset($sourceInfo['user_login']) ? trim($sourceInfo['user_login']) : '';
- $sourceNickname = $sourceNickname? $sourceNickname : formatName($userLogin);
- // 旧用户不结算
- $createTime = isset($sourceInfo['create_time'])? $sourceInfo['create_time'] : 0;
- if ($createTime && $createTime <= strtotime('2021-02-20')) {
- $logData['error'] = '审核用户注册时间不在结算范围内';
- PRedis::set("{$cacheKey}:error_user_reg_time", $logData, 7200);
- return false;
- }
- // 一级分销收益结算
- $logData['level'] = 1;
- $level1Award = isset($marketConfig['level_1']) ? floatval($marketConfig['level_1']) : 0;
- $awardMoney = $marketType==1? moneyFormat($level1Award) : moneyFormat($money * ($level1Award / 100),3);
- $logData['levelAward'] = $level1Award;
- $typeNames = [4=>'完善资料',5=>'完成身份认证',6=>'完成学历认证',7=>'完成工作认证',9=>'报名参加活动'];
- $typeName = isset($typeNames[$type])? $typeNames[$type] : ($money? "支付{$money}元,": '消费');
- if ($level1Award > 0 && $level1Award <= 100 && $awardMoney > 0) {
- // 账户变动
- Db::startTrans();
- if (Member::where($where)->setInc('balance', $awardMoney)) {
- // 写入奖励日志
- $levelName = "您邀请的[{$sourceNickname}]用户";
- $marketName = isset($marketConfig['name']) ? $marketConfig['name'] : '分销收益';
- $logTitle = "{$levelName}{$typeName},获得{$marketName}{$awardMoney}元";
- $log = [
- 'change' => $awardMoney,
- 'type' => $type,
- 'level' => 1,
- 'change_type' => 1,
- 'pay_money' => $awardMoney,
- 'user_id' => $userId,
- 'source_uid' => $sourceUid,
- 'balance' => moneyFormat($balance + $awardMoney),
- 'description' => $logTitle,
- 'create_time' => time(),
- 'status' => 2,
- ];
- $logData['log'] = $log;
- PRedis::set("{$cacheKey}:log", $logData, 7200);
- if(UserBalanceLog::insertGetId($log)){
- // 账户明细
- $accountData = [
- 'type' => 4,
- 'account_type' => 2,
- 'change_type' => 1,
- 'user_id' => $userId,
- 'money' => $awardMoney,
- 'balance' => $balance,
- 'created_at' => date('Y-m-d H:i:s'),
- 'remark' => $logTitle,
- ];
- if(AccountLog::insertGetId($accountData)){
- // 发送模板消息
- $openid = isset($userInfo['openid'])? $userInfo['openid'] : '';
- if($openid){
- $checkTime = date('Y.m.d H:i');
- $remark = "感谢您对拾光的信任,我们一起解救单身青年!点击查看收益明细";
- $msgParams = [
- 'title' => "您邀请的用户[$sourceNickname]{$typeName}所得的收益已到账!\n\n结算类型:\t{$marketName}",
- 'remark' => $remark,
- 'type' => 'income',
- 'keywords' => [
- 'keyword1' => [
- 'value' => "{$awardMoney}",
- 'color' => '#173177',
- ],
- 'keyword2' => [
- 'value' => $checkTime,
- 'color' => '#173177',
- ],
- ],
- 'url' => url('/weixin/market/income', '', '', true),
- ];
- PRedis::set("{$cacheKey}:message", ['result' => $userInfo, 'params' => $msgParams], 600);
- Wechat::sendTplMsg($openid, $msgParams);
- }
- Db::commit();;
- }else{
- PRedis::set("{$cacheKey}:account_log", $logData, 7200);
- Db::rollback();
- }
- }else{
- PRedis::set("{$cacheKey}:balance_log", $logData, 7200);
- Db::rollback();
- }
- } else {
- PRedis::set("{$cacheKey}:update_balance", $logData, 7200);
- Db::rollback();
- }
- } else {
- PRedis::set("{$cacheKey}:error_awardMoney", $logData, 7200);
- }
- // 二级分销收益结算
- $logData['level'] = 2;
- $logData['userInfo'] = [];
- $logData['log'] = [];
- $userTwoId = isset($userInfo['parent_id'])? intval($userInfo['parent_id']) : 0;
- $cacheKey = "market:award:u_{$userTwoId}_{$sourceUid}_{$type}";
- $logData['userTwoId'] = $userTwoId;
- if($userTwoId<=0 || $userTwoId == $userId || $userTwoId == $sourceUid){
- PRedis::set("{$cacheKey}:market2", $logData, 7200);
- return false;
- }
- $whereTwo = ['id' => $userTwoId, 'agent_type' => 1, 'agent_status' => 1];
- $userInfoTwo = Member::getInfo($whereTwo, $field);
- $balanceTwo = isset($userInfoTwo['balance']) ? floatval($userInfoTwo['balance']) : 0;
- $logData['userInfo'] = $userInfoTwo;
- if(empty($userInfoTwo)){
- PRedis::set("{$cacheKey}:error_userTwo", $logData, 7200);
- return false;
- }
- $level2Award = isset($marketConfig['level_2']) ? floatval($marketConfig['level_2']) : 0;
- $awardMoneyTwo = $marketType==1? moneyFormat($level2Award) : moneyFormat($money * ($level2Award / 100));
- $logData['levelAward'] = $level2Award;
- if ($level2Award > 0 && $level2Award <= 100 && $awardMoneyTwo > 0) {
- // 账户变动
- Db::startTrans();
- if (Member::where($whereTwo)->setInc('balance', $awardMoneyTwo)) {
- // 写入奖励日志
- $levelName = "您的下级[{$nickname}:]邀请的[{$sourceNickname}]用户";
- $marketName = isset($marketConfig['name']) ? $marketConfig['name'] : '分销收益';
- $logTitle = "{$levelName}{$typeName},获得{$marketName}{$awardMoneyTwo}元";
- $log = [
- 'change' => $awardMoneyTwo,
- 'type' => $type,
- 'level' => 2,
- 'change_type' => 1,
- 'pay_money' => $awardMoneyTwo,
- 'user_id' => $userTwoId,
- 'source_uid' => $userId,
- 'balance' => moneyFormat($balanceTwo + $awardMoneyTwo),
- 'description' => $logTitle,
- 'create_time' => time(),
- 'status' => 2,
- ];
- $logData['log'] = $log;
- PRedis::set("{$cacheKey}:log", $logData, 7200);
- if(UserBalanceLog::insertGetId($log)){
- // 账户明细
- $accountData = [
- 'type' => 4,
- 'account_type' => 2,
- 'change_type' => 1,
- 'user_id' => $userTwoId,
- 'money' => $awardMoneyTwo,
- 'balance' => $balanceTwo,
- 'created_at' => date('Y-m-d H:i:s'),
- 'remark' => $logTitle,
- ];
- if(AccountLog::insertGetId($accountData)){
- // 发送模板消息
- $openid = isset($userInfoTwo['openid'])? $userInfoTwo['openid'] : '';
- if($openid){
- $checkTime = date('Y.m.d H:i');
- $remark = "感谢您对拾光的信任,我们一起解救单身青年!点击查看收益明细";
- $msgParams = [
- 'title' => "您的下级[$nickname]邀请的用户[{$sourceNickname}]{$typeName}所得的收益已到账!\n\n结算类型:\t{$marketName}",
- 'remark' => $remark,
- 'type' => 'income',
- 'keywords' => [
- 'keyword1' => [
- 'value' => "{$awardMoneyTwo}",
- 'color' => '#173177',
- ],
- 'keyword2' => [
- 'value' => $checkTime,
- 'color' => '#173177',
- ],
- ],
- 'url' => url('/weixin/market/income', '', '', true),
- ];
- PRedis::set("{$cacheKey}:message", ['result' => $userInfoTwo, 'params' => $msgParams], 600);
- Wechat::sendTplMsg($openid, $msgParams);
- }
- Db::commit();
- }else{
- PRedis::set("{$cacheKey}:account_log", $logData, 7200);
- Db::rollback();
- return false;
- }
- }else{
- PRedis::set("{$cacheKey}:balance_log", $logData, 7200);
- Db::rollback();
- return false;
- }
- } else {
- PRedis::set("{$cacheKey}:update_balance", $logData, 7200);
- Db::rollback();
- return false;
- }
- } else {
- PRedis::set("{$cacheKey}:error_awardMoney", $logData, 7200);
- return false;
- }
- return true;
- }
- }
|