userId = $userId; if(is_int($fundId)){ $this->fundId = $fundId; }else{ $this->fundId = $fundId->valueInt(); } $this->fundModel = FundModel::query() ->where('user_id', $userId) ->where('fund_id', $fundId) ->first(); } /** * 资金流转 * (同用户,同币种,不同账户) * * @param int $to_fund * @param int $amount * @param string $remark */ public function circulation(FUND_TYPE $to_fund_id, int $amount, int $re_id, string $re_type, string $remark) { # 确认货币种类一致 if (!CurrencyService::check($this->fundId, $to_fund_id->valueInt())) { return '币种不一致,禁止划转'; } # 实例化操作对象 Helper::check_tr(); # 先进行转账记录 $re_id = Circulation::handle($this->userId, $this->fundId, $to_fund_id->valueInt(), $amount, $re_id, $re_type, $remark); if (is_string($re_id)) { return $re_id; } # 进行双方的资金修改 # 先减少自己的 $re46 = User::handle($this->userId, $this->fundId, -$amount, LOG_TYPE::CIRCULATION, $re_id, $remark); if (is_string($re46)) { return $re46; } # 再增加自己另一个账户 $re51 = User::handle($this->userId, $to_fund_id->valueInt(), $amount, LOG_TYPE::CIRCULATION, $re_id, $remark); if (is_string($re51)) { return $re51; } return true; } /** * 获取余额 */ public function balance(): int { return $this->fundModel->balance ?? 0; } /** * 转账 * (不同人,同账户/同币种) */ public function transfer(int $toUserId, int $amount, string $remark) { # 实例化操作对象 # 开启事务 DB::beginTransaction(); # 先进行转账记录 $transfer_id = Transfer::to_user( $this->userId, $this->fundId, $toUserId, $amount, $remark); if (is_string($transfer_id)) { DB::rollBack(); return $transfer_id; } # 进行双方的资金修改 # 先减少自己的 $re46 = User::handle($this->userId, $this->fundId, -$amount, LOG_TYPE::TRANSFER, $transfer_id, $remark); if (is_string($re46)) { DB::rollBack(); return $re46; } # 再增加别人的 $re51 = User::handle($toUserId, $this->fundId, $amount, LOG_TYPE::TRANSFER, $transfer_id, $remark); if (is_string($re51)) { DB::rollBack(); return $re51; } DB::commit(); return true; } /** * 贸易(业务关联) * 同账户/同币种,不同用户 * * @param int $toUserId * @param int $amount * @param string $transfer_type * @param string $transfer_id * @param string $remark * @return string|true */ public function trade(int $toUserId, int $amount, $transfer_type, $transfer_id, string $remark) { # 检查事务开启 Helper::check_tr(); $transfer_id = $transfer_type.'-'.$transfer_id; # 先减少自己的 $re46 = User::handle($this->userId, $this->fundId, -$amount, LOG_TYPE::TRADE, $transfer_id, $remark); if (is_string($re46)) { \UCore\Trace::addData('error', $re46); return $re46; } # 再增加别人的 $re51 = User::handle($toUserId, $this->fundId, $amount, LOG_TYPE::TRANSFER, $transfer_id, $remark); if (is_string($re51)) { \UCore\Trace::addData('error', $re51); return $re51; } return true; } /** * Admin 资金操作 * * @param int $admin_id * @param FUND_TYPE $fund_id * @param int $fund_fee * @param $remark * @return bool|string */ public function admin_operate(int $admin_id, FUND_TYPE $fund_id, int $fund_fee, $remark) { $data = [ 'total_fee' => $fund_fee, 'status' => 1, 'user_id' => $this->userId, 'fund_id' => $fund_id->valueInt(), 'admin_id' => $admin_id, 'create_time' => time(), 'remark' => $remark ]; # 启动事务 DB::beginTransaction(); # 写日志 $fund_admin = new FundAdminModel(); $fund_admin->setData($data); if ($fund_admin->save() === false) { DB::rollBack(); return '_Model-error'; } # 进行资金操作 $re = \App\Module\Fund\Service\User::handle($this->userId, $fund_id->value, $fund_fee, \App\Module\Fund\Enums\LOG_TYPE::ADMIN, $fund_admin->id, $remark); if (is_string($re)) { DB::rollBack(); return $re; } DB::commit(); return $re; } }