withSearch(['out_separate_no', 'status'], $params) ->append(['status_text']) ->paginate($pageAndLimit); } /** * @param int $userID * @param int $receiverID * @param float $amount * @return self */ public function createOrder(int $userID, int $receiverID, float $amount): self { $receiver = ProfitShareReceiverModel::where([ 'id' => $receiverID, 'user_id' => $userID, 'status' => ReceiverStatusEnum::BOUND, ])->findOrEmpty(); if ($receiver->isEmpty()) { throw_logic_exception('分账接收方不存在或未绑定'); } $merInfo = LedgerService::queryLedgerMer($receiver->mer_cup_no, $receiver->org_id); $calculateData = $this->calculateOrder($amount, $merInfo->splitLowestRatio); $this->save([ 'merchant_no' => $receiver->mer_cup_no, 'user_id' => $userID, 'total_amt' => $calculateData['total_amt'], 'lkl_org_no' => $receiver->org_id, 'cal_type' => 0, // 按照指定金额 'recv_merchant_no' => $receiver->mer_cup_no, 'recv_no' => $receiver->receiver_no, 'separate_value' => $calculateData['separate_value'], 'status' => ProfitShareOrderStatusEnum::PENDING, 'fee_amt' => $calculateData['fee_amt'], 'cmd_type' => ProfitShareOrderCMDTypeEnum::SEPARATE, ]); return $this; } /** * 计算分账数据 * * @param float $amount * @return array{total_amt:int, fee_amt:int, separate_value:int} */ private function calculateOrder(float $amount, float $splitLowestRatio): array { $splitLowestRatio = bcsub(100, (string)$splitLowestRatio, 2); $fee = Config::getConfig('profit_share_fee'); $feeAmt = bcmul((string)$amount, (string)$fee, 2); if (bccomp($feeAmt, '1') == -1) { $feeAmt = 1; } $seprateValue = bcmul((string)$amount, '100', 2); $seprateValue = bcsub($seprateValue, $feeAmt); $totalAmout = bcmul($seprateValue, '100', 2); $totalAmout = bcdiv($totalAmout, (string)$splitLowestRatio); return [ 'total_amt' => $totalAmout, 'fee_amt' => (int)$feeAmt, 'separate_value' => (int)$seprateValue, ]; } }