| // +------------------------------------------------+ 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; } } } }