191 lines
6.5 KiB
PHP
191 lines
6.5 KiB
PHP
<?php
|
||
// +------------------------------------------------+
|
||
// |http://www.cjango.com |
|
||
// +------------------------------------------------+
|
||
// | 修复BUG不是一朝一夕的事情,等我喝醉了再说吧! |
|
||
// +------------------------------------------------+
|
||
// | Author: 小陈叔叔 <Jason.Chen> |
|
||
// +------------------------------------------------+
|
||
namespace app\common\service;
|
||
|
||
use app\common\model\Account as AccountModel;
|
||
use app\common\model\AccountLogs as AccountLogsModel;
|
||
use app\common\model\AccountRules as AccountRulesModel;
|
||
use app\common\model\Member as MemberModel;
|
||
use app\common\model\VipOrder as VipOrderModel;
|
||
use app\common\service\Member as MemberService;
|
||
use think\Config;
|
||
use think\Db;
|
||
use tools\Time;
|
||
|
||
class Account extends _Init
|
||
{
|
||
/**
|
||
* [add description]
|
||
* @param [type] $data [description]
|
||
*/
|
||
public static function create($uid)
|
||
{
|
||
$info = AccountModel::find($uid);
|
||
if (!$info) {
|
||
$data = [
|
||
'uid' => $uid,
|
||
];
|
||
AccountModel::create($data);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 对某一个用户执行账户规则
|
||
* @param [type] $uid [执行用户]
|
||
* @param [type] $rule [规则ID或关键字]
|
||
* @param integer $increase [执行数量/如果规则写了固定数量可以为空]
|
||
* @param string $remark [规则描述,空为规则默认描述]
|
||
* @param integer $fromuser [溯源用户ID,可以为空]
|
||
* @param integer $freezing [是否冻结,1冻结 0即时到账]
|
||
* @param string $ordeid [关联订单ID 可以为空]
|
||
* @return [type] [description]
|
||
*/
|
||
public static function rule($uid, $rule, $increase = 0, $remark = '', $fromuser = 0, $freezing = 0, $orderid = '')
|
||
{
|
||
if (is_numeric($rule)) {
|
||
$ruleMap['id'] = $rule;
|
||
} else {
|
||
$ruleMap['name'] = $rule;
|
||
}
|
||
$rule = AccountRulesModel::where($ruleMap)->find();
|
||
if (!$rule) {
|
||
return '规则不存在';
|
||
}
|
||
|
||
$account = AccountModel::where('uid', $uid)->find();
|
||
$balance = $account->getData($rule->type);
|
||
|
||
if ($rule->times == -1 && AccountLogsModel::where(['rule_id' => $rule->id, 'uid' => $uid])->find()) {
|
||
return '用户行为已经执行过';
|
||
} elseif ($rule->times > 0) {
|
||
// 判断当日最大可执行次数
|
||
$todayTime = \tools\Time::day();
|
||
$AccountLog = AccountLogsModel::where(['rule_id' => $rule->id, 'uid' => $uid, 'create_time' => ['between', $todayTime]])->count('id');
|
||
if ($AccountLog >= $rule->times) {
|
||
return '今日行为次数已用尽';
|
||
}
|
||
}
|
||
|
||
if ($increase != 0) {
|
||
$rule->increase = $increase;
|
||
}
|
||
|
||
if ($rule->increase < 0 && $balance < abs($rule->increase)) {
|
||
return '账户余额不足';
|
||
}
|
||
if (!$remark) {
|
||
$remark = $rule->remark;
|
||
}
|
||
Db::startTrans();
|
||
$ruleLog = [
|
||
'uid' => $uid,
|
||
'rule_id' => $rule->id,
|
||
'type' => $rule->type,
|
||
'increase' => $rule->increase,
|
||
'balance' => $balance + $rule->increase,
|
||
'remark' => $remark,
|
||
'fromuser' => $fromuser,
|
||
'freezing' => $freezing,
|
||
'orderid' => $orderid,
|
||
];
|
||
if (AccountLogsModel::create($ruleLog)) {
|
||
if (!$freezing) {
|
||
AccountModel::where(['uid' => $uid])->exp($rule->type, $rule->type . '+' . $rule->increase)->update();
|
||
}
|
||
Db::commit();
|
||
return true;
|
||
} else {
|
||
Db::rollback();
|
||
return '行为执行失败';
|
||
}
|
||
}
|
||
|
||
//推荐奖
|
||
public static function commission($orderid)
|
||
{
|
||
$order = VipOrderModel::where('orderid', $orderid)->find();
|
||
if ($order->commission == 1) {
|
||
return "已经执行过了";
|
||
}
|
||
|
||
$user = $order->member ?? '';
|
||
if ($order && $user) {
|
||
$puser = $user->puser;
|
||
if ($puser) {
|
||
$share_commission = Config::get('share_commission');
|
||
|
||
$cash = round($order->money * $share_commission, 2); //计算实际获得金额
|
||
|
||
$res = self::rule($puser->id, 'open_' . $order->type, $cash, '', $order->uid, '', $order->orderid);
|
||
if ($res === true && $puser->openid) {
|
||
$account = [
|
||
'openid' => $puser->openid,
|
||
'create_time' => date('Y-m-d'),
|
||
'increase' => (string) $cash,
|
||
'balance' => $puser->account->price,
|
||
];
|
||
|
||
if ($order->type == 'vip') {
|
||
$type = 1;
|
||
} elseif ($order->type == 'agent') {
|
||
$type = 2;
|
||
} else {
|
||
$type = '';
|
||
}
|
||
|
||
//加模板消息
|
||
Tmplmsg::account($account);
|
||
self::management($puser, $cash, $order->orderid);
|
||
}
|
||
}
|
||
$order->commission = 1;
|
||
$order->save();
|
||
|
||
}
|
||
}
|
||
|
||
//管理奖
|
||
protected static function management($user, $money, $orderid)
|
||
{
|
||
$plist = MemberService::getSub($user->id);
|
||
|
||
if ($plist) {
|
||
$management_ratio = Config::get('management_ratio');
|
||
|
||
$prev = $user->id;
|
||
foreach ($plist as $key => $p) {
|
||
$puser = MemberModel::get($p);
|
||
//如果不是代理商分润到此
|
||
if ($puser->info->is_agent != 1) {
|
||
break;
|
||
}
|
||
$temp = $money * $management_ratio;
|
||
if ($temp < 0.01) {
|
||
break;
|
||
}
|
||
$cash = intval($temp * 100) / 100;
|
||
|
||
$res = self::rule($p, 'management', $cash, '', $prev, '', $orderid);
|
||
if ($res && $puser->openid) {
|
||
$account = [
|
||
'openid' => $puser->openid,
|
||
'create_time' => date('Y-m-d'),
|
||
'increase' => (string) $cash,
|
||
'balance' => $puser->account->price,
|
||
];
|
||
//加模板消息
|
||
Tmplmsg::account($account);
|
||
}
|
||
$money = $cash;
|
||
$prev = $p;
|
||
}
|
||
}
|
||
}
|
||
}
|