396 lines
13 KiB
PHP
396 lines
13 KiB
PHP
<?php
|
|
/**
|
|
* Created by PhpStorm.
|
|
* User: shenyang
|
|
* Date: 2018/11/13
|
|
* Time: 5:07 PM
|
|
*/
|
|
|
|
namespace app\common\modules\trade\models;
|
|
|
|
use app\common\events\order\AfterTradeCreatedEvent;
|
|
use app\common\events\order\AfterTradeCreatingEvent;
|
|
use app\common\models\BaseModel;
|
|
use app\common\models\DispatchType;
|
|
use app\common\models\order\OrderDeliver;
|
|
use app\common\models\order\OrderMergeCreate;
|
|
use app\common\modules\memberCart\MemberCartCollection;
|
|
use app\common\modules\order\OrderCollection;
|
|
use app\framework\Http\Request;
|
|
use app\frontend\models\Member;
|
|
use app\frontend\modules\order\models\PreOrder;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Yunshop\CulturalSpace\models\CulturalSpace;
|
|
use Yunshop\PackageDelivery\models\DeliveryOrder;
|
|
use Yunshop\StoreCashier\common\models\SelfDelivery;
|
|
|
|
/**
|
|
* Class Trade
|
|
* @package app\common\modules\trade\models
|
|
* @property OrderCollection orders
|
|
* @property TradeDiscount discount
|
|
* @property float total_deduction_price
|
|
* @property float total_discount_price
|
|
* @property float total_dispatch_price
|
|
* @property float total_goods_price
|
|
* @property float total_price
|
|
*/
|
|
class Trade extends BaseModel
|
|
{
|
|
/**
|
|
* @var MemberCartCollection
|
|
*/
|
|
private $memberCartCollection;
|
|
/**
|
|
* @var Member
|
|
*/
|
|
private $member;
|
|
/**
|
|
* @var Request
|
|
*/
|
|
private $request;
|
|
|
|
public function init(MemberCartCollection $memberCartCollection, $member = null, $request = null)
|
|
{
|
|
$this->request = $request ?: request();
|
|
$this->memberCartCollection = $memberCartCollection;
|
|
$this->member = $member;
|
|
event(new AfterTradeCreatingEvent($this));
|
|
$this->setRelation('orders', $this->getOrderCollection($memberCartCollection, $member, $this->request));
|
|
$this->setRelation('discount', $this->getDiscount());
|
|
$this->setRelation('dispatch', $this->getDispatch());
|
|
$this->last_deliver_user_info = $this->getLastDeliverUserInfo();
|
|
$this->amount_items = $this->getAmountItems();
|
|
$this->discount_amount_items = $this->getDiscountAmountItems();
|
|
$this->fee_items = $this->getFeeItems();
|
|
$this->service_fee_items = $this->getServiceFeeItems();
|
|
$this->tax_fee_items = $this->getTaxFeeItems();
|
|
$this->total_price = $this->orders->sum('price');
|
|
$this->is_diy_form_jump = \Setting::get('shop.order.is_diy_form_jump') ?: 0;
|
|
$member = Member::current();
|
|
$this->balance = $member->credit2 ?: 0;
|
|
// 判断:当前订单是否为文创豆兑换商品
|
|
$this->use_legumes_exchange_total = $this->orders->sum('use_legumes_total');
|
|
$this->use_legumes_price_total = $this->orders->sum('use_legumes_price');
|
|
$this->is_allow_exchange = 0;// 是否允许兑换 默认不允许
|
|
if($this->use_legumes_exchange_total > 0){
|
|
// $holdGoodsLegumes = CulturalSpace::uniacid()->where('uid',$member->uid)->value('goods_legumes');
|
|
$holdGoodsLegumesPrice = CulturalSpace::uniacid()->where('uid',$member->uid)->value('goods_legumes_money');
|
|
$this->is_allow_exchange = (int)($holdGoodsLegumesPrice >= $this->use_legumes_price_total);
|
|
}
|
|
|
|
event(new AfterTradeCreatedEvent($this));
|
|
}
|
|
|
|
/**
|
|
* 获取最后一次自提填写的信息
|
|
* @return array
|
|
*/
|
|
protected function getLastDeliverUserInfo()
|
|
{
|
|
$uid = \YunShop::app()->getMemberId();
|
|
$dispatch_type_id = $this->request->dispatch_type_id;
|
|
switch ($dispatch_type_id) {
|
|
case DispatchType::PACKAGE_DELIVER :
|
|
case DispatchType::STORE_PACKAGE_DELIVER :
|
|
return $this->packageDeliverUserInfo($uid);
|
|
case DispatchType::PACKAGE_DELIVERY:
|
|
return $this->shopDeliverUserInfo($uid);
|
|
default :
|
|
return $this->storeDeliverUserInfo($uid);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 商城自提
|
|
* @param $uid
|
|
* @return array|null
|
|
*/
|
|
private function shopDeliverUserInfo($uid)
|
|
{
|
|
$setting = \Setting::get('plugin.package_delivery');
|
|
if ($setting['open_state']) {
|
|
$delivery_order = DeliveryOrder::where('uid', $uid)
|
|
->orderBy('id', 'desc')
|
|
->first(['buyer_name', 'buyer_mobile']);
|
|
if ($delivery_order) {
|
|
return [
|
|
"realname" => $delivery_order->buyer_name,
|
|
"mobile" => $delivery_order->buyer_mobile,
|
|
];
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* 门店自提点用户最后的信息
|
|
* @param $uid
|
|
* @return array|null
|
|
*/
|
|
private function storeDeliverUserInfo($uid)
|
|
{
|
|
$is_enabled = app('plugins')->isEnabled("store-cashier");
|
|
|
|
//开启插件
|
|
if ($is_enabled) {
|
|
$order_deliver = SelfDelivery::where("uid", $uid)->orderBy('id', 'desc')->first(['member_mobile', 'member_realname']);
|
|
if ($order_deliver) {
|
|
return [
|
|
"realname" => $order_deliver->member_realname,
|
|
"mobile" => $order_deliver->member_mobile,
|
|
];
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* 自提点插件用户最后的信息
|
|
* @param $uid
|
|
* @return array|null
|
|
*/
|
|
private function packageDeliverUserInfo($uid)
|
|
{
|
|
$is_enabled = app('plugins')->isEnabled("package-deliver");
|
|
if ($is_enabled) {
|
|
$order_deliver = OrderDeliver::where('uid', $uid)->orderBy('id', 'desc')->first(['order_id']);
|
|
if ($order_deliver) {
|
|
return [
|
|
"realname" => $order_deliver->hasOneOrderAddress->realname,
|
|
"mobile" => $order_deliver->hasOneOrderAddress->mobile,
|
|
];
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public function getMemberCartCollection()
|
|
{
|
|
return $this->memberCartCollection;
|
|
}
|
|
|
|
public function getServiceFeeItems()
|
|
{
|
|
// 按照code合并
|
|
$orderFeesItems = [];
|
|
foreach ($this->orders as $order) {
|
|
foreach ($order->orderServiceFees as $orderServiceFee) {
|
|
if ($orderServiceFee->checked) {
|
|
if (isset($orderFeesItems[$orderServiceFee['code']])) {
|
|
$orderFeesItems[$orderServiceFee['code']]['amount'] += $orderServiceFee['amount'];
|
|
} else {
|
|
$orderFeesItems[$orderServiceFee['code']] = [
|
|
'code' => $orderServiceFee['code'],
|
|
'name' => $orderServiceFee['name'],
|
|
'amount' => $orderServiceFee['amount'],
|
|
];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return array_values($orderFeesItems);
|
|
}
|
|
|
|
public function getTaxFeeItems()
|
|
{
|
|
// 按照code合并
|
|
$orderTaxFeesItems = [];
|
|
foreach ($this->orders as $order) {
|
|
foreach ($order->orderTaxFees as $orderTaxFee) {
|
|
if ($orderTaxFee->checked) {
|
|
if (isset($orderTaxFeesItems[$orderTaxFee['code']])) {
|
|
$orderTaxFeesItems[$orderTaxFee['code']]['amount'] += $orderTaxFee['amount'];
|
|
} else {
|
|
$orderTaxFeesItems[$orderTaxFee['code']] = [
|
|
'code' => $orderTaxFee['code'],
|
|
'name' => $orderTaxFee['name'],
|
|
'amount' => $orderTaxFee['amount'],
|
|
];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return array_values($orderTaxFeesItems);
|
|
}
|
|
|
|
public function getFeeItems()
|
|
{
|
|
// 按照code合并
|
|
$orderFeesItems = [];
|
|
foreach ($this->orders as $order) {
|
|
foreach ($order->orderFees as $orderFee) {
|
|
if (isset($orderFeesItems[$orderFee['fee_code']])) {
|
|
$orderFeesItems[$orderFee['fee_code']]['amount'] += $orderFee['amount'];
|
|
} else {
|
|
$orderFeesItems[$orderFee['fee_code']] = [
|
|
'code' => $orderFee['fee_code'],
|
|
'name' => $orderFee['name'],
|
|
'amount' => $orderFee['amount'],
|
|
];
|
|
}
|
|
}
|
|
}
|
|
foreach ($orderFeesItems as &$item) {
|
|
$item['amount'] = sprintf('%.2f', $item['amount']);
|
|
}
|
|
return array_values($orderFeesItems);
|
|
}
|
|
|
|
private function getAmountItems()
|
|
{
|
|
$items = [
|
|
[
|
|
'code' => 'total_goods_price',
|
|
'name' => '订单总金额',
|
|
'amount' => $this->orders->sum('order_goods_price'),
|
|
], [
|
|
'code' => 'total_dispatch_price',
|
|
'name' => '总运费',
|
|
'amount' => $this->orders->sum('dispatch_price'),
|
|
]
|
|
];
|
|
if ($this->orders->sum('deduction_price')) {
|
|
$items[] = [
|
|
'code' => 'total_deduction_price',
|
|
'name' => '总' . $this->deductionLang(),
|
|
'amount' => $this->orders->sum('deduction_price'),
|
|
];
|
|
}
|
|
|
|
return $items;
|
|
}
|
|
|
|
private function getCoinExchanges()
|
|
{
|
|
$point = 0;
|
|
$this->orders->map(function ($order) use (&$point) {
|
|
$order->orderCoinExchanges->map(function ($coinExchange) use (&$point) {
|
|
if (in_array($coinExchange->code, ['point'])) {
|
|
$point += $coinExchange->coin;
|
|
}
|
|
});
|
|
});
|
|
if (!$point) {
|
|
return 0;
|
|
}
|
|
$this->orders->map(function ($order) use (&$point) {
|
|
$order->orderDeductions->map(function ($deduction) use (&$point) {
|
|
if (in_array($deduction->code, ['point']) && $deduction->checked) {
|
|
$point += $deduction->coin;
|
|
}
|
|
});
|
|
});
|
|
|
|
return $point;
|
|
}
|
|
|
|
private function coinExchangeLang()
|
|
{
|
|
$point_name = \Setting::get('shop.shop')['credit1'] ?: '积分';
|
|
return $point_name;
|
|
}
|
|
|
|
private function deductionLang()
|
|
{
|
|
$langSetting = \Setting::get('shop.lang');
|
|
|
|
return $langSetting[$langSetting['lang']]['order']['deduction_lang'] ?: "抵扣";
|
|
}
|
|
|
|
/**
|
|
* @return mixed
|
|
*/
|
|
private function getDiscountAmountItems()
|
|
{
|
|
// 按照code合并
|
|
$orderDiscountsItems = [];
|
|
foreach ($this->orders as $order) {
|
|
foreach ($order->orderDiscounts as $orderDiscount) {
|
|
if (isset($orderDiscountsItems[$orderDiscount['discount_code']])) {
|
|
$orderDiscountsItems[$orderDiscount['discount_code']]['amount'] += $orderDiscount['amount'];
|
|
} else {
|
|
if ($orderDiscount['amount'] > 0 && !in_array($orderDiscount['discount_code'], ['coinExchange'])) {
|
|
$orderDiscountsItems[$orderDiscount['discount_code']] = [
|
|
'code' => $orderDiscount['discount_code'],
|
|
'name' => $orderDiscount['name'],
|
|
'amount' => $orderDiscount['amount'],
|
|
'no_show' => $orderDiscount['no_show'],
|
|
];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
foreach ($orderDiscountsItems as &$item) {
|
|
$item['amount'] = sprintf('%.2f', $item['amount']);
|
|
}
|
|
|
|
if ($point = $this->getCoinExchanges()) {
|
|
$orderDiscountsItems[] = [
|
|
'code' => 'pointCoinExchanges',
|
|
'name' => '总' . $this->coinExchangeLang(),
|
|
'amount' => $point,
|
|
'no_show' => 0,
|
|
];
|
|
}
|
|
|
|
return array_values($orderDiscountsItems);
|
|
}
|
|
|
|
/**
|
|
* 显示订单数据
|
|
* @return array
|
|
*/
|
|
public function toArray()
|
|
{
|
|
$attributes = parent::toArray();
|
|
$attributes = $this->formatAmountAttributes($attributes);
|
|
return $attributes;
|
|
}
|
|
|
|
private function getOrderCollection(MemberCartCollection $memberCartCollection, $member = null, $request = null)
|
|
{
|
|
// 按插件分组
|
|
$groups = $memberCartCollection->groupByGroupId()->values();
|
|
// 分组下单
|
|
$orderCollection = $groups->map(function (MemberCartCollection $memberCartCollection) use ($member, $request) {
|
|
return $memberCartCollection->getOrder($memberCartCollection->getPlugin(), $member, $request);
|
|
});
|
|
|
|
|
|
return app('OrderManager')->make(OrderCollection::class, $orderCollection->all());
|
|
}
|
|
|
|
/**
|
|
* @return TradeDiscount
|
|
*/
|
|
private function getDiscount()
|
|
{
|
|
$tradeDiscount = new TradeDiscount();
|
|
$tradeDiscount->init($this);
|
|
return $tradeDiscount;
|
|
}
|
|
|
|
private function getDispatch()
|
|
{
|
|
$tradeDispatch = new TradeDispatch();
|
|
$tradeDispatch->init($this);
|
|
return $tradeDispatch;
|
|
}
|
|
|
|
public function generate()
|
|
{
|
|
DB::transaction(function () {
|
|
$this->orders->map(function (PreOrder $order) {
|
|
/**
|
|
* @var $order
|
|
*/
|
|
$order->generate();
|
|
$order->fireCreatedEvent();
|
|
});
|
|
OrderMergeCreate::saveData($this->orders->pluck('id')->implode(','));
|
|
return $this->orders;
|
|
});
|
|
}
|
|
}
|