734 lines
29 KiB
PHP
Executable File
734 lines
29 KiB
PHP
Executable File
<?php
|
|
/**
|
|
* @createtime 2023/4/23
|
|
* @author wild
|
|
* @copyright PhpStorm
|
|
*/
|
|
|
|
|
|
namespace App\Service;
|
|
|
|
use App\Enums\BillType;
|
|
use App\Enums\BoolEnum;
|
|
use App\Enums\FreezeType;
|
|
use App\Enums\OrderType;
|
|
use App\Enums\SellerLevel;
|
|
use App\Enums\WithdrawState;
|
|
use App\Enums\WithdrawType;
|
|
use App\Exceptions\JingCaiException;
|
|
use App\Http\RequestValidators\BankValidator;
|
|
use App\Model\AgentSale;
|
|
use App\Model\Config;
|
|
use App\Model\Customer\Customer;
|
|
use App\Model\Lottery;
|
|
use App\Model\Order;
|
|
use App\Model\Seller\Seller;
|
|
use App\Model\Seller\Shop;
|
|
use App\Model\Seller\ShopBill;
|
|
use App\Model\Seller\ShopCooperate;
|
|
use App\Model\Seller\ShopCooperateBill;
|
|
use App\Model\Seller\ShopCooperateLottery;
|
|
use App\Model\Seller\ShopFreeze;
|
|
use App\Model\Seller\ShopRecharge;
|
|
use App\Model\Seller\ShopWithdraw;
|
|
use App\Utils\ThrowException;
|
|
use Illuminate\Support\Arr;
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
class SellerWalletService
|
|
{
|
|
public static function adminRecharge($shopId,$adminId, $money)
|
|
{
|
|
DB::beginTransaction();
|
|
try {
|
|
|
|
// 增加余额
|
|
$beforeShop = Shop::find($shopId);
|
|
Shop::balanceRecharge($shopId, $money);
|
|
|
|
// 账单
|
|
$endShop = Shop::find($shopId);
|
|
$bill = new ShopBill();
|
|
$bill->type = ShopBill::TYPE_INCR;
|
|
$bill->seller_id = 0;
|
|
$bill->shop_id = $shopId;
|
|
$bill->money = $money;
|
|
$bill->begin_balance = $beforeShop->balance;
|
|
$bill->begin_balance_withdraw = $beforeShop->balance_withdraw;
|
|
$bill->begin_balance_cash = $beforeShop->balance_cash;
|
|
$bill->end_balance = $endShop->balance;
|
|
$bill->end_balance_withdraw = $endShop->balance_withdraw;
|
|
$bill->end_balance_cash = $endShop->balance_cash;
|
|
$bill->begin_balance_freeze = $beforeShop->balance_freeze;
|
|
$bill->end_balance_freeze = $endShop->balance_freeze;
|
|
$bill->ie = '+';
|
|
$bill->title = '系统加款';
|
|
$bill->remark = '管理员['.$adminId.']给店铺加款';
|
|
$bill->created_date = date('Ymd');
|
|
$bill->save();
|
|
DB::commit();
|
|
} catch (\Exception $exception) {
|
|
DB::rollBack();
|
|
throw $exception;
|
|
}
|
|
}
|
|
|
|
public static function recharge(ShopRecharge $recharge)
|
|
{
|
|
ThrowException::isTrue(!$recharge->isSuccess(), '充值单未成功');
|
|
|
|
// 增加余额
|
|
$beforeShop = Shop::find($recharge->shop_id);
|
|
Shop::balanceRecharge($recharge->shop_id, $recharge->pay_money);
|
|
|
|
// 账单
|
|
$endShop = Shop::find($recharge->shop_id);
|
|
$bill = new ShopBill();
|
|
$bill->type = ShopBill::TYPE_RECHARGE;
|
|
$bill->seller_id = $recharge->seller_id;
|
|
$bill->shop_id = $beforeShop->id;
|
|
$bill->money = $recharge->pay_money;
|
|
$bill->begin_balance = $beforeShop->balance;
|
|
$bill->begin_balance_withdraw = $beforeShop->balance_withdraw;
|
|
$bill->begin_balance_cash = $beforeShop->balance_cash;
|
|
$bill->end_balance = $endShop->balance;
|
|
$bill->end_balance_withdraw = $endShop->balance_withdraw;
|
|
$bill->end_balance_cash = $endShop->balance_cash;
|
|
$bill->begin_balance_freeze = $beforeShop->balance_freeze;
|
|
$bill->end_balance_freeze = $endShop->balance_freeze;
|
|
$bill->ie = '+';
|
|
$bill->title = '充值';
|
|
$bill->created_date = date('Ymd');
|
|
$bill->save();
|
|
}
|
|
|
|
/**
|
|
* 出票相关金额和账单
|
|
* @param Order $order
|
|
* @param Seller $seller
|
|
* @throws \Exception
|
|
*/
|
|
public static function ticket(Order $order, Seller $seller)
|
|
{
|
|
DB::beginTransaction();
|
|
try {
|
|
/** @var Customer $customer */
|
|
$customer = Customer::find($order->customer_id);
|
|
$agentor = $customer->agentor;
|
|
|
|
// 代理用户的佣金
|
|
$agentBrokerage = 0;
|
|
// 如果用户有上级代理,并且设置了佣金
|
|
if ($agentor && $agentor->agent && $agentor->agent_brokerage > 0) {
|
|
$agentBrokerage = $order->money * ($agentor->agent_brokerage / 100);
|
|
}
|
|
// 出票服务费
|
|
$feeMoney = $order->money * Config::platformFeeLv();
|
|
|
|
$allReduceMoney = 0 + $feeMoney;
|
|
/** @var Shop $shop */
|
|
$shop = Shop::find($seller->shop_id);
|
|
if ($shop->balanceActive() < $allReduceMoney) {
|
|
ThrowException::run('余额不足,无法出票');
|
|
}
|
|
|
|
// 如果是合作出票,需要扣除合作余额
|
|
$isUnion = false;
|
|
if ($order->shop_id != $seller->shop_id) {
|
|
$isUnion = true;
|
|
self::cooperateTicket($seller, $order);
|
|
}
|
|
|
|
// 扣除出票服务费
|
|
self::ticketFee($order, $seller, $feeMoney, $isUnion);
|
|
// 代理佣金
|
|
if ($agentor && $agentor->agent) {
|
|
// 代理用户佣金
|
|
if ($agentBrokerage) {
|
|
// 扣除代理用户佣金
|
|
// $shopBill = self::customerAgentBrokerage($order, $seller, $agentBrokerage);
|
|
|
|
// 代理用户增加佣金
|
|
// CustomerWalletService::agentBrokerage($order, $agentor->id, $seller->id, $shopBill->id, $agentBrokerage);
|
|
|
|
AgentSale::log($agentor, $order, $agentBrokerage);
|
|
}
|
|
}
|
|
|
|
// 如果是合买
|
|
if ($order->type == OrderType::UNION) {
|
|
// 有需要退款的
|
|
if ($order->union_piece_keep > 0) {
|
|
// 保底份数 - 未出售份数
|
|
$remainPiece = $order->union_piece_total - $order->union_piece_buy;
|
|
$backPiece = $order->union_piece_keep - $remainPiece;
|
|
|
|
// 如果超额保底,则退款多余保底金额
|
|
if ($backPiece > 0) {
|
|
$backPayMoney = $backPiece * $order->union_piece_money;
|
|
$order->union_piece_keep = $remainPiece;
|
|
$order->union_money -= $backPayMoney;
|
|
$order->save();
|
|
CustomerWalletService::backUnionKeepMoney($order, $backPayMoney);
|
|
}
|
|
}
|
|
|
|
// 代理佣金
|
|
$unionOrders = Order::where('pid', $order->id)->get();
|
|
foreach ($unionOrders as $unionOrder) {
|
|
/** @var Customer $customer */
|
|
$unionCustomer = Customer::find($unionOrder->customer_id);
|
|
$unionAgentor = $unionCustomer->agentor;
|
|
// 代理用户的佣金
|
|
$unionAgentBrokerage = 0;
|
|
// 如果用户有上级代理,并且设置了佣金
|
|
if ($unionAgentor && $unionAgentor->agent && $unionAgentor->agent_brokerage > 0) {
|
|
$unionAgentBrokerage = $unionOrder->union_money * ($unionAgentor->agent_brokerage / 100);
|
|
|
|
if ($unionAgentBrokerage) {
|
|
// 扣除代理用户佣金
|
|
// $shopBill = self::customerAgentBrokerage($order, $seller, $unionAgentBrokerage);
|
|
// 代理用户增加佣金
|
|
// CustomerWalletService::agentBrokerage($order, $unionAgentor->id, $seller->id, $shopBill->id, $unionAgentBrokerage);
|
|
|
|
AgentSale::log($unionAgentor, $unionOrder, $unionAgentBrokerage);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
DB::commit();
|
|
} catch (JingCaiException $exception) {
|
|
DB::rollBack();
|
|
throw $exception;
|
|
} catch (\Exception $exception) {
|
|
DB::rollBack();
|
|
throw $exception;
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* 出票服务费
|
|
* @param Order $order
|
|
* @param Seller $seller
|
|
* @param $feeMoney
|
|
* @return ShopBill
|
|
* @throws \Exception
|
|
*/
|
|
public static function ticketFee(Order $order, Seller $seller, $feeMoney, $isUnion = false)
|
|
{
|
|
$beforeShop = Shop::find($seller->shop_id);
|
|
|
|
Shop::balanceReduce($seller->shop_id, $feeMoney);
|
|
|
|
$endShop = Shop::find($seller->shop_id);
|
|
|
|
$bill = new ShopBill();
|
|
$bill->type = ShopBill::TYPE_FEE;
|
|
$bill->seller_id = $seller->id;
|
|
$bill->cooped = $isUnion;
|
|
$bill->order_id = $order->id;
|
|
$bill->shop_id = $beforeShop->id;
|
|
$bill->money = $feeMoney;
|
|
$bill->begin_balance = $beforeShop->balance;
|
|
$bill->begin_balance_withdraw = $beforeShop->balance_withdraw;
|
|
$bill->begin_balance_cash = $beforeShop->balance_cash;
|
|
$bill->end_balance = $endShop->balance;
|
|
$bill->end_balance_withdraw = $endShop->balance_withdraw;
|
|
$bill->end_balance_cash = $endShop->balance_cash;
|
|
$bill->begin_balance_freeze = $beforeShop->balance_freeze;
|
|
$bill->end_balance_freeze = $endShop->balance_freeze;
|
|
$bill->ie = '-';
|
|
$bill->title = sprintf('出票基础服务费(订单%d元)', $order->money);
|
|
$bill->created_date = date('Ymd');
|
|
$bill->save();
|
|
return $bill;
|
|
}
|
|
|
|
private static function customerAgentBrokerage(Order $order, Seller $seller, $agentBrokerage)
|
|
{
|
|
$beforeShop = Shop::find($seller->shop_id);;
|
|
// 店主余额减少
|
|
Shop::balanceReduce($seller->shop_id, $agentBrokerage);
|
|
$endShop = Shop::find($beforeShop->id);
|
|
|
|
$money = $order->money;
|
|
if ($order->type == OrderType::UNION) {
|
|
$money = $order->union_money;
|
|
}
|
|
|
|
$bill = new ShopBill();
|
|
$bill->type = ShopBill::TYPE_AGENT;
|
|
$bill->seller_id = $seller->id;
|
|
$bill->order_id = $order->id;
|
|
$bill->shop_id = $beforeShop->id;
|
|
$bill->money = $agentBrokerage;
|
|
$bill->begin_balance = $beforeShop->balance;
|
|
$bill->begin_balance_withdraw = $beforeShop->balance_withdraw;
|
|
$bill->begin_balance_cash = $beforeShop->balance_cash;
|
|
$bill->end_balance = $endShop->balance;
|
|
$bill->end_balance_withdraw = $endShop->balance_withdraw;
|
|
$bill->end_balance_cash = $endShop->balance_cash;
|
|
$bill->begin_balance_freeze = $beforeShop->balance_freeze;
|
|
$bill->end_balance_freeze = $endShop->balance_freeze;
|
|
$bill->ie = '-';
|
|
$bill->title = sprintf('用户销售佣金(订单%d元)', $money);
|
|
$bill->created_date = date('Ymd');
|
|
$bill->save();
|
|
return $bill;
|
|
}
|
|
|
|
|
|
|
|
public static function gendanShopReduceAllBrokerage(Seller $seller, Order $order, $sendPrize) {
|
|
$fadanBrokerage = $order->lottery_gendan_brokerage_all;
|
|
|
|
if ($fadanBrokerage <= 0) {
|
|
return;
|
|
}
|
|
|
|
$beforeShop = Shop::find($order->shop_id);
|
|
// 店主余额减少
|
|
Shop::balanceReduce($order->shop_id, $fadanBrokerage);
|
|
|
|
$endShop = Shop::find($order->shop_id);
|
|
|
|
$bill = new ShopBill();
|
|
$bill->type = ShopBill::TYPE_FADAN_ALL;
|
|
$bill->seller_id = $seller->id;
|
|
$bill->order_id = $order->id;
|
|
$bill->shop_id = $beforeShop->id;
|
|
$bill->money = $fadanBrokerage;
|
|
$bill->begin_balance = $beforeShop->balance;
|
|
$bill->begin_balance_withdraw = $beforeShop->balance_withdraw;
|
|
$bill->begin_balance_cash = $beforeShop->balance_cash;
|
|
$bill->end_balance = $endShop->balance;
|
|
$bill->end_balance_withdraw = $endShop->balance_withdraw;
|
|
$bill->end_balance_cash = $endShop->balance_cash;
|
|
$bill->begin_balance_freeze = $beforeShop->balance_freeze;
|
|
$bill->end_balance_freeze = $endShop->balance_freeze;
|
|
$bill->ie = '-';
|
|
$bill->title = sprintf('平台扣除跟单佣金(订单%d元)', $order->money);
|
|
$bill->remark = '跟单人店铺被扣除10%';
|
|
$bill->created_date = date('Ymd');
|
|
$bill->save();
|
|
}
|
|
public static function gendanShopIncrBrokerage(Seller $seller, Order $order, $sendPrize) {
|
|
$fadanBrokerage = $order->lottery_gendan_brokerage_all * Config::fadanShopFeeLv();
|
|
|
|
if ($fadanBrokerage <= 0) {
|
|
return;
|
|
}
|
|
|
|
$beforeShop = Shop::find($order->shop_id);
|
|
// 店主余额增加
|
|
Shop::balanceIncr($order->shop_id, $fadanBrokerage);
|
|
|
|
$endShop = Shop::find($order->shop_id);
|
|
|
|
$bill = new ShopBill();
|
|
$bill->type = ShopBill::TYPE_FADAN_ALL;
|
|
$bill->seller_id = $seller->id;
|
|
$bill->order_id = $order->id;
|
|
$bill->shop_id = $beforeShop->id;
|
|
$bill->money = $fadanBrokerage;
|
|
$bill->begin_balance = $beforeShop->balance;
|
|
$bill->begin_balance_withdraw = $beforeShop->balance_withdraw;
|
|
$bill->begin_balance_cash = $beforeShop->balance_cash;
|
|
$bill->end_balance = $endShop->balance;
|
|
$bill->end_balance_withdraw = $endShop->balance_withdraw;
|
|
$bill->end_balance_cash = $endShop->balance_cash;
|
|
$bill->begin_balance_freeze = $beforeShop->balance_freeze;
|
|
$bill->end_balance_freeze = $endShop->balance_freeze;
|
|
$bill->ie = '+';
|
|
$bill->title = sprintf('平台派发跟单佣金(订单%d元)', $order->money);
|
|
$bill->remark = '跟单人店铺获得2%';
|
|
$bill->created_date = date('Ymd');
|
|
$bill->save();
|
|
}
|
|
|
|
|
|
/**
|
|
* 发单人店铺 获取部分发单佣金
|
|
* @param Order $order
|
|
* @param $shopId
|
|
* @param $sendPrize
|
|
*/
|
|
public static function fadanShopIncrBrokerage(Order $order, $shopId, $sendPrize) {
|
|
|
|
$allFadanBrokerage = $order->lottery_gendan_brokerage_all;
|
|
$fadanBrokerage = $allFadanBrokerage * Config::fadanUserFeeLv();
|
|
if ($fadanBrokerage <= 0) {
|
|
return;
|
|
}
|
|
$beforeShop = Shop::find($shopId);
|
|
// 店主余额增加
|
|
Shop::balanceIncr($shopId, $fadanBrokerage);
|
|
$endShop = Shop::find($shopId);
|
|
|
|
$bill = new ShopBill();
|
|
$bill->type = ShopBill::TYPE_FADAN_SHOP;
|
|
$bill->seller_id = 0;
|
|
$bill->order_id = $order->id;
|
|
$bill->shop_id = $shopId;
|
|
$bill->money = $fadanBrokerage;
|
|
$bill->begin_balance = $beforeShop->balance;
|
|
$bill->begin_balance_withdraw = $beforeShop->balance_withdraw;
|
|
$bill->begin_balance_cash = $beforeShop->balance_cash;
|
|
$bill->end_balance = $endShop->balance;
|
|
$bill->end_balance_withdraw = $endShop->balance_withdraw;
|
|
$bill->end_balance_cash = $endShop->balance_cash;
|
|
$bill->begin_balance_freeze = $beforeShop->balance_freeze;
|
|
$bill->end_balance_freeze = $endShop->balance_freeze;
|
|
$bill->ie = '+';
|
|
$bill->title = sprintf('平台派发发单佣金(订单%d元)', $order->money);
|
|
$bill->remark = '发单人店铺余额增加6%';
|
|
$bill->created_date = date('Ymd');
|
|
$bill->save();
|
|
}
|
|
|
|
|
|
public function withdrawMoney(Seller $seller, $data)
|
|
{
|
|
ThrowException::isTrue(!$seller->real_identity || !$seller->real_name, '请先完成实名认证');
|
|
$type = Arr::get($data, 'type', 0);
|
|
$money = Arr::get($data, 'money', 0);
|
|
$ali_account = Arr::get($data, 'ali_account', '');
|
|
$bank_no = Arr::get($data, 'bank_no', '');
|
|
$bank_area = Arr::get($data, 'bank_area', '');
|
|
$bank_master = Arr::get($data, 'bank_master', '');
|
|
$bank_branch = Arr::get($data, 'bank_branch', '');
|
|
$password_pay = Arr::get($data, 'password_pay', '');
|
|
|
|
ThrowException::isTrue($type != WithdrawType::BANK && $type != WithdrawType::ALI, '不支持该方式');
|
|
|
|
ThrowException::isTrue($money > Config::shopWithdrawMax(), '超过限额');
|
|
$seller = Seller::find($seller->id);
|
|
ThrowException::isTrue($seller->level != SellerLevel::MASTER, '无权操作');
|
|
ThrowException::isTrue(!$seller->password_pay, '请设置支付密码');
|
|
ThrowException::isTrue(!Seller::checkPassword($password_pay, $seller->password_pay), '支付密码错误');
|
|
if ($type == WithdrawType::BANK) {
|
|
$errors = BankValidator::hasErrors($data);
|
|
ThrowException::isTrue($errors, $errors);
|
|
}
|
|
DB::beginTransaction();
|
|
try {
|
|
$shop = Shop::lockForUpdate()->find($seller->shop_id);
|
|
|
|
ThrowException::isTrue($shop->balance_withdraw < $money, '可提现金额不足');
|
|
$shop->balance_withdraw -= $money;
|
|
$shop->balance_freeze += $money;
|
|
$shop->save();
|
|
|
|
$freeze = new ShopFreeze();
|
|
$freeze->shop_id = $shop->id;
|
|
$freeze->type = FreezeType::WITHDRAW;
|
|
$freeze->money = $money;
|
|
$freeze->state = BoolEnum::YES;
|
|
$freeze->description = '';
|
|
$freeze->save();
|
|
|
|
$withdraw = new ShopWithdraw();
|
|
$withdraw->shop_id = $seller->shop_id;
|
|
$withdraw->seller_id = $seller->id;
|
|
$withdraw->freeze_id = $freeze->id;
|
|
$withdraw->type = $type;
|
|
$withdraw->state = WithdrawState::PENDING;
|
|
$withdraw->money = $money;
|
|
$withdraw->ali_account = $ali_account;
|
|
$withdraw->bank_no = $bank_no;
|
|
$withdraw->bank_area = $bank_area;
|
|
$withdraw->bank_master = $bank_master;
|
|
$withdraw->bank_branch = $bank_branch;
|
|
$withdraw->save();
|
|
DB::commit();
|
|
} catch (JingCaiException $exception) {
|
|
DB::rollBack();
|
|
throw $exception;
|
|
} catch (\Exception $exception) {
|
|
DB::rollBack();
|
|
throw $exception;
|
|
}
|
|
}
|
|
|
|
// TODO 此处Seller需要更换为Admin表
|
|
public function withdrawAudit(Seller $admin, $data)
|
|
{
|
|
$id = Arr::get($data, 'id');
|
|
$state = Arr::get($data, 'state');
|
|
$remark = Arr::get($data, 'remark');
|
|
ThrowException::isTrue($id < 1, '参数错误');
|
|
|
|
ThrowException::isTrue(!in_array($state, [WithdrawState::SUCCESS, WithdrawState::FAIL]), '状态错误');
|
|
|
|
DB::beginTransaction();
|
|
try {
|
|
$withdraw = ShopWithdraw::lockForUpdate()->find($id);
|
|
ThrowException::isTrue(!$withdraw, '数据不存在');
|
|
ThrowException::isTrue($withdraw->state != WithdrawState::PENDING, '数据状态异常,不可操作');
|
|
|
|
$freeze = ShopFreeze::lockForUpdate()->find($withdraw->freeze_id);
|
|
ThrowException::isTrue($freeze->state == BoolEnum::NO, '数据已被处理');
|
|
|
|
$shop = Shop::lockForUpdate()->find($withdraw->shop_id);
|
|
ThrowException::isTrue($shop->balance_freeze < $withdraw->money, '冻结金额不足');
|
|
|
|
$freeze->state = BoolEnum::NO;
|
|
$freeze->save();
|
|
|
|
if ($state == WithdrawState::SUCCESS) {
|
|
|
|
$shop->balance_freeze -= $withdraw->money;
|
|
$shop->save();
|
|
|
|
$endShop = Shop::find($shop->id);
|
|
|
|
$bill = new ShopBill();
|
|
$bill->type = BillType::WITHDRAW;
|
|
$bill->title = '提现';
|
|
$bill->shop_id = $shop->id;
|
|
$bill->recharge_id = 0;
|
|
$bill->order_id = 0;
|
|
$bill->ie = '-';
|
|
$bill->begin_balance = $shop->balance;
|
|
$bill->begin_balance_withdraw = $shop->balance_withdraw;
|
|
$bill->begin_balance_cash = $shop->balance_cash;
|
|
$bill->end_balance = $endShop->balance;
|
|
$bill->end_balance_withdraw = $endShop->balance_withdraw;
|
|
$bill->end_balance_cash = $endShop->balance_cash;
|
|
$bill->begin_balance_freeze = $shop->balance_freeze;
|
|
$bill->end_balance_freeze = $endShop->balance_freeze;
|
|
$bill->money = $withdraw->money;
|
|
$bill->admin_id = $admin->id;
|
|
$bill->created_date = date('Ymd');
|
|
$bill->save();
|
|
|
|
} else if ($state == WithdrawState::FAIL){
|
|
$shop->balance_freeze -= $withdraw->money;
|
|
$shop->balance_withdraw += $withdraw->money;
|
|
$shop->save();
|
|
}
|
|
|
|
$withdraw->state = $state;
|
|
$withdraw->admin_id = $admin->id;
|
|
$withdraw->admin_remark = strval($remark);
|
|
$withdraw->remark_at = date('Y-m-d H:i:s');
|
|
$withdraw->save();
|
|
|
|
DB::commit();
|
|
} catch (JingCaiException $exception) {
|
|
DB::rollBack();
|
|
throw $exception;
|
|
} catch (\Exception $exception) {
|
|
DB::rollBack();
|
|
throw $exception;
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* 合作出票
|
|
* @param Seller $seller
|
|
* @param $data
|
|
* @return void
|
|
* @throws \Exception
|
|
*/
|
|
public static function cooperateTicket(Seller $seller, Order $order)
|
|
{
|
|
/** @var Lottery $lottery */
|
|
$lottery = $order->lottery;
|
|
|
|
/** @var ShopCooperateLottery $scl */
|
|
$scl = $lottery->shopCooperateLottery;
|
|
ThrowException::isTrue(!$scl || $scl->cooperate_id != $seller->shop_id, '非合作店铺,无法出票');
|
|
DB::beginTransaction();
|
|
try {
|
|
$sc = ShopCooperate::lockForUpdate()->find($scl->shop_cooperate_id);
|
|
ThrowException::isTrue(!$sc || $sc->cooperate_id != $seller->shop_id, '非合作店铺,无法出票!');
|
|
|
|
$payMoney = $order->getPayMoney();
|
|
$brokerageMoney = $scl->getBrokerageMoney($payMoney);
|
|
$money = $payMoney - $brokerageMoney;
|
|
|
|
ThrowException::isTrue(bc_lt($sc->balance, $order->getPayMoney()), '合作店铺余额不足,无法出票!');
|
|
|
|
$beginBalance = $sc->balance;
|
|
$sc->balance -= $money;
|
|
$sc->save();
|
|
|
|
$scb = new ShopCooperateBill();
|
|
$scb->order_id = $order->id;
|
|
$scb->lottery_type_id = $order->lottery_type_id;
|
|
$scb->type = ShopCooperateBill::TYPE_TICKET;
|
|
$scb->title = $scb->getTypeTitle();
|
|
$scb->seller_id = $seller->id;
|
|
$scb->seller_shop_id = $seller->shop_id;
|
|
$scb->shop_cooperate_id = $sc->id;
|
|
$scb->shop_id = $order->shop_id;
|
|
$scb->money = $money;
|
|
$scb->begin_balance = $beginBalance;
|
|
$scb->end_balance = $sc->balance;
|
|
$scb->cooperate_brokerage = $brokerageMoney;
|
|
$scb->ie = '-';
|
|
$scb->remark = strval('');
|
|
$scb->created_date = date('Ymd');
|
|
$scb->save();
|
|
DB::commit();
|
|
} catch (JingCaiException $exception) {
|
|
DB::rollBack();
|
|
throw $exception;
|
|
|
|
} catch (\Exception $exception) {
|
|
DB::rollBack();
|
|
throw $exception;
|
|
|
|
}
|
|
}
|
|
|
|
public function cooperateIncr(Seller $seller, $data)
|
|
{
|
|
$money = Arr::get($data, 'money');
|
|
$remark = Arr::get($data, 'remark');
|
|
$shopId = Arr::get($data, 'shop_id');
|
|
ThrowException::isTrue($money <= 0, '金额不能小于0');
|
|
|
|
DB::beginTransaction();
|
|
try {
|
|
$sc = ShopCooperate::where('cooperate_id', $seller->shop_id)
|
|
->where('shop_id', $shopId)
|
|
->lockForUpdate()
|
|
->first();
|
|
ThrowException::isTrue(!$sc, '非合作关系');
|
|
ThrowException::isTrue($sc->audit_state != BoolEnum::YES, '审核未成功');
|
|
|
|
$beginBalance = $sc->balance;
|
|
|
|
$sc->balance += $money;
|
|
$sc->save();
|
|
|
|
$scb = new ShopCooperateBill();
|
|
$scb->type = ShopCooperateBill::TYPE_INCR;
|
|
$scb->shop_cooperate_id = $sc->id;
|
|
$scb->title = $scb->getTypeTitle();
|
|
$scb->seller_id = $seller->id;
|
|
$scb->seller_shop_id = $seller->shop_id;
|
|
$scb->shop_id = $shopId;
|
|
$scb->money = $money;
|
|
$scb->begin_balance = $beginBalance;
|
|
$scb->end_balance = $sc->balance;
|
|
$scb->ie = '+';
|
|
$scb->remark = strval($remark);
|
|
$scb->created_date = date('Ymd');
|
|
$scb->save();
|
|
DB::commit();
|
|
} catch (JingCaiException $exception) {
|
|
DB::rollBack();
|
|
throw $exception;
|
|
|
|
} catch (\Exception $exception) {
|
|
DB::rollBack();
|
|
throw $exception;
|
|
|
|
}
|
|
}
|
|
|
|
public static function cooperateOrderWined(Seller $seller, $order)
|
|
{
|
|
if ($order->cooperate_id == 0 && $order->cooperate_show != BoolEnum::NO) {
|
|
return;
|
|
}
|
|
if ($seller->shop_id == $order->shop_id || $seller->shop_id != $order->cooperate_id) {
|
|
return;
|
|
}
|
|
$money = $order->lottery_send_prize;
|
|
$shopId = $order->shop_id;
|
|
|
|
DB::beginTransaction();
|
|
try {
|
|
$sc = ShopCooperate::where('cooperate_id', $seller->shop_id)
|
|
->where('shop_id', $shopId)
|
|
->lockForUpdate()
|
|
->first();
|
|
ThrowException::isTrue(!$sc, '非合作关系');
|
|
|
|
$beginBalance = $sc->balance;
|
|
|
|
$sc->balance += $money;
|
|
$sc->save();
|
|
|
|
$scb = new ShopCooperateBill();
|
|
$scb->type = ShopCooperateBill::TYPE_WINED;
|
|
$scb->order_id = $order->id;
|
|
$scb->lottery_type_id = $order->lottery_type_id;
|
|
$scb->shop_cooperate_id = $sc->id;
|
|
$scb->title = $scb->getTypeTitle();
|
|
$scb->seller_id = $seller->id;
|
|
$scb->seller_shop_id = $seller->shop_id;
|
|
$scb->shop_id = $shopId;
|
|
$scb->money = $money;
|
|
$scb->begin_balance = $beginBalance;
|
|
$scb->end_balance = $sc->balance;
|
|
$scb->ie = '+';
|
|
$scb->remark = strval('');
|
|
$scb->created_date = date('Ymd');
|
|
$scb->save();
|
|
DB::commit();
|
|
} catch (JingCaiException $exception) {
|
|
DB::rollBack();
|
|
throw $exception;
|
|
|
|
} catch (\Exception $exception) {
|
|
DB::rollBack();
|
|
throw $exception;
|
|
|
|
}
|
|
}
|
|
|
|
public function cooperateReduce(Seller $seller, $data)
|
|
{
|
|
$money = Arr::get($data, 'money');
|
|
$remark = Arr::get($data, 'remark');
|
|
$shopId = Arr::get($data, 'shop_id');
|
|
ThrowException::isTrue($money <= 0, '金额不能小于0');
|
|
|
|
DB::beginTransaction();
|
|
try {
|
|
$sc = ShopCooperate::where('cooperate_id', $seller->shop_id)
|
|
->where('shop_id', $shopId)
|
|
->lockForUpdate()
|
|
->first();
|
|
ThrowException::isTrue(!$sc, '非合作关系');
|
|
ThrowException::isTrue($sc->audit_state != BoolEnum::YES, '审核未成功');
|
|
ThrowException::isTrue(bc_gt($money, $sc->balance), '余额不足,无法扣款');
|
|
|
|
$beginBalance = $sc->balance;
|
|
|
|
$sc->balance -= $money;
|
|
$sc->save();
|
|
|
|
$scb = new ShopCooperateBill();
|
|
$scb->type = ShopCooperateBill::TYPE_REDUCE;
|
|
$scb->title = $scb->getTypeTitle();
|
|
$scb->seller_id = $seller->id;
|
|
$scb->seller_shop_id = $seller->shop_id;
|
|
$scb->shop_cooperate_id = $sc->id;
|
|
$scb->shop_id = $shopId;
|
|
$scb->money = $money;
|
|
$scb->begin_balance = $beginBalance;
|
|
$scb->end_balance = $sc->balance;
|
|
$scb->ie = '-';
|
|
$scb->remark = strval($remark);
|
|
$scb->created_date = date('Ymd');
|
|
$scb->save();
|
|
DB::commit();
|
|
} catch (JingCaiException $exception) {
|
|
DB::rollBack();
|
|
throw $exception;
|
|
} catch (\Exception $exception) {
|
|
DB::rollBack();
|
|
throw $exception;
|
|
}
|
|
}
|
|
}
|