From f1930e5fdc09d3c14866fa10670f60bfd943f542 Mon Sep 17 00:00:00 2001 From: iron Date: Mon, 9 Dec 2019 20:14:14 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=B0=83=E8=AF=95=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E8=BF=90=E8=B4=B9=E8=AE=A1=E7=AE=97=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/logic/AddressLogic.php | 4 +- api/logic/ExpressLogic.php | 66 +++++++++++------------ api/logic/Helper.php | 1 + api/logic/OrderLogic.php | 14 +++-- backend/modules/shop/models/ars/Order.php | 11 ++-- backend/views/layouts/main.php | 6 ++- 6 files changed, 58 insertions(+), 44 deletions(-) diff --git a/api/logic/AddressLogic.php b/api/logic/AddressLogic.php index 1bce840..6e1a98b 100644 --- a/api/logic/AddressLogic.php +++ b/api/logic/AddressLogic.php @@ -53,7 +53,7 @@ class AddressLogic extends BaseObject */ public function update() { - $type = Yii::$app->request->getQueryParam('type'); + $type = Yii::$app->request->getBodyParam('type'); $address = $this->findAddress(); if ($type == self::SET_DEFAULT_ADDRESS) { return $this->setDefaultAddress($address); @@ -61,7 +61,7 @@ class AddressLogic extends BaseObject $data = $this->getParams(); $address->load($data, ''); if (!$address->save()) { - throw new ServerErrorHttpException('地址添加失败'); + throw new ServerErrorHttpException('服务器更新地址失败'); } return true; } diff --git a/api/logic/ExpressLogic.php b/api/logic/ExpressLogic.php index f898c3b..fc58234 100644 --- a/api/logic/ExpressLogic.php +++ b/api/logic/ExpressLogic.php @@ -34,27 +34,24 @@ class ExpressLogic extends BaseObject */ public function countShippingAmount($order) { - if ($order->shipping_type == Order::SHIPPING_TYPE_PICKED_UP) { - return 0; - } $this->order = $order; - $allGoods = $this->findDifferentExpressTypeGoods($order);/*获取不同运费计算模式的商品*/ + $allGoods = $this->findDifferentExpressTypeGoods();/*获取不同运费计算模式的商品*/ $uniformPostage = $this->countGoodsExpress($allGoods['uniformPostageGoods'], Goods::EXPRESS_TYPE_UNIFORM_POSTAGE);/*计算统一运费模式下所有商品运费*/ - $expressTemplate = $this->countGoodsExpress($allGoods['uniformPostageGoods'], Goods::EXPRESS_TYPE_EXPRESS_TEMPLATE);/*计算运费模板模式下所有商品的运费*/ - return $uniformPostage > $expressTemplate ? $uniformPostage : $expressTemplate;/*比较两种不同运费计算模式下,取金额大的值为最终收取运费*/ + $expressTemplate = $this->countGoodsExpress($allGoods['useTemplateGoods'], Goods::EXPRESS_TYPE_EXPRESS_TEMPLATE);/*计算运费模板模式下所有商品的运费*/ + $amount = $uniformPostage > $expressTemplate ? $uniformPostage : $expressTemplate;/*比较两种不同运费计算模式下,取金额大的值为最终收取运费*/ + return $amount / 100; /*将金额单位[分]转化为[元]*/ } /*--------------------------------------------------------------------------------------*/ /** - * @param $order * @return array * @throws NotFoundHttpException * 获取不同运费计算模式的商品 */ - private function findDifferentExpressTypeGoods($order) + private function findDifferentExpressTypeGoods() { $uniformPostage = $useTemplate = []; - $allGoods = OrderGoods::findAll(['order_id' => $order->id, 'user_id' => Yii::$app->user->getId()]); + $allGoods = OrderGoods::findAll(['order_id' => $this->order->id]); foreach ($allGoods as $orderGoods) { $goods = Goods::findOne(['id' => $orderGoods->goods_id, 'is_sale' => Goods::IS_SALE_YES, 'is_delete' => Goods::IS_DELETE_NO]); if (!$goods) { @@ -82,38 +79,28 @@ class ExpressLogic extends BaseObject */ private function countGoodsExpress($allGoods, $type) { - if (!$type == Goods::EXPRESS_TYPE_UNIFORM_POSTAGE) { + if ($type == Goods::EXPRESS_TYPE_UNIFORM_POSTAGE) { $amount = 0; - foreach ($allGoods['object'] as $goods) { - $amount = $goods->uniform_postage > $amount ? $goods->uniform_postage : $amount; + foreach ($allGoods as $goods) { + $amount = $goods['object']->uniform_postage > $amount ? $goods['object']->uniform_postage : $amount; } return $amount; } else { $extraPrice = 0; $areasIds = []; - foreach ($allGoods['object'] as $k => $goods) { + foreach ($allGoods as $goods) { + $areasIds[] = $this->getAreaId($goods['object']->express_template); + } + /*获取首重运费和对应的计费规则id*/ + $basic = $this->getBasicPriceAndAreaId($areasIds); + foreach ($allGoods as $goods) { /*计算增重运费*/ - $extraPrice += $this->countExtraAmount($allGoods['count'][$k], $allGoods['weight'][$k], $goods->express_template); - $areasIds[] = $this->getAreaId($goods->express_template); + $extraPrice += $this->countExtraAmount($goods['count'], $goods['weight'], $goods['object']->express_template, $basic['id']); } - $basic = $this->getBasicPriceAndAreaId($areasIds);/*获取首重运费和对应的计费规则id*/ - /*返回所有按运费模板计费的商品运费(基础运费 + 所有商品增重运费 - 多余的增重运费)*/ - return $basic['price'] + $extraPrice - $this->countSurplusPrice($basic['id']); + return ($basic['price'] + $extraPrice); } } - /** - * @param $areaId - * @return float|int - * @throws NotFoundHttpException - * 计算多余(多算的)运费 - * 选定作为基础运费的计费规则对应商品基础数量内的增重费用 - */ - private function countSurplusPrice($areaId) - { - $area = $this->findArea($areaId); - return $area->extra_price * ceil($area->basic_count / $area->extra_count); - } /** * @param $areaIds @@ -139,20 +126,29 @@ class ExpressLogic extends BaseObject * @param $count * @param $weight * @param $templateId + * @param $areaId * @return float|int * @throws NotFoundHttpException * 计算增重运费 */ - private function countExtraAmount($count, $weight, $templateId) + private function countExtraAmount($count, $weight, $templateId, $areaId) { $area = $this->findArea($this->getAreaId($templateId)); $template = $this->findTemplate($templateId); if ($template->calculation_type == ExpressTemplate::CALCULATION_TYPE_WEIGHT) { - $amount = $area->extra_price * ceil($weight / $area->extra_count); + if ($area->id == $areaId) { + $amount = $weight - $area->basic_count > 0 ? $weight - $area->basic_count : 0; + } else { + $amount = $weight; + } } else { - $amount = $area->extra_price * ceil($count / $area->extra_count); + if ($area->id == $areaId) { + $amount = $count - $area->basic_count > 0 ? $count - $area->basic_count : 0; + } else { + $amount = $count; + } } - return $amount; + return $area->extra_price * ceil($amount / $area->extra_count); } /** @@ -171,7 +167,7 @@ class ExpressLogic extends BaseObject return $area->id; } } - throw new NotFoundHttpException('超出配送范围(无对应地区运费计算规则)'); + throw new NotFoundHttpException('超出配送范围(未找到对应地区运费计算规则)'); } /** diff --git a/api/logic/Helper.php b/api/logic/Helper.php index b47d18e..0c5db86 100644 --- a/api/logic/Helper.php +++ b/api/logic/Helper.php @@ -113,6 +113,7 @@ class Helper $sku = GoodsSku::findOne($skuId); $goods = Goods::findOne($goodsId); if (!$goods) { + print_r($goodsId);exit; throw new NotFoundHttpException('商品未找到'); } if (!$sku && $goods->stock == Goods::UNLIMITED_STOCK) { diff --git a/api/logic/OrderLogic.php b/api/logic/OrderLogic.php index a2300c4..cfad6b2 100644 --- a/api/logic/OrderLogic.php +++ b/api/logic/OrderLogic.php @@ -59,8 +59,6 @@ class OrderLogic extends Component $tra = Yii::$app->db->beginTransaction(); try { $order = new Order(); - $order->user_id = Yii::$app->user->getId(); - $order->type = Order::TYPE_SHOPPING; if (!$order->save()) { throw new ServerErrorHttpException('服务器创建订单失败'); } @@ -69,7 +67,6 @@ class OrderLogic extends Component } else { $this->addGoodsByCart($cartIds, $order->id);/*通过购物车添加订单商品*/ } - Helper::checkStock($goodsId, $count, $skuId); /*检查库存*/ $this->saveGoodsInfo($order);/*保存订单商品信息*/ $tra->commit(); Helper::createdResponse($order, $this->viewAction); @@ -356,15 +353,26 @@ class OrderLogic extends Component $orderGoods->goods_id = $goodsId; $orderGoods->sku_id = $skuId ?: 0; $orderGoods->sku_value = Helper::skuValue($skuId); + $orderGoods->weight = $skuId ? $this->skuWeight($skuId) : $goods->weight; $orderGoods->goods_count = $count; $orderGoods->goods_img = $goods->image; $orderGoods->goods_name = $goods->name; $orderGoods->price = Helper::goodsPrice($goodsId, $skuId); + Helper::checkStock($goodsId, $count, $skuId); /*检查库存*/ if (!$orderGoods->save()) { throw new Exception('服务器添加订单商品失败'); } } + private function skuWeight($skuId) + { + $sku = GoodsSku::findOne($skuId); + if (!$sku) { + throw new NotFoundHttpException('sku未找到'); + } + return $sku->weight; + } + /** * @return array|Order|null * 根据id获取订单 diff --git a/backend/modules/shop/models/ars/Order.php b/backend/modules/shop/models/ars/Order.php index f6ae050..196256c 100755 --- a/backend/modules/shop/models/ars/Order.php +++ b/backend/modules/shop/models/ars/Order.php @@ -3,7 +3,6 @@ namespace backend\modules\shop\models\ars; use Yii; -use yii\base\Object; use yii\behaviors\TimestampBehavior; /** @@ -78,7 +77,6 @@ class Order extends \yii\db\ActiveRecord public function rules() { return [ - [['user_id'], 'required'], [['user_id', 'status', 'type', 'goods_count', 'goods_amount', 'shipping_amount', 'shipping_type', 'taking_site', 'pay_type', 'pay_at', 'payment_amount', 'receivables', 'discount_amount'], 'integer'], [['discount_description', 'address'], 'string'], [['order_sn', 'invoice_id'], 'string', 'max' => 64], @@ -127,7 +125,14 @@ class Order extends \yii\db\ActiveRecord public function beforeSave($insert) { - if ($this->status === self::STATUS_UNCONFIRMED && $this->type == self::TYPE_SHOPPING) { + if ($insert) { + $this->user_id = Yii::$app->user->getId(); + $this->type = Order::TYPE_SHOPPING; + //TODO 测试 + $this->city = '445100'; + $this->type = Order::TYPE_SHOPPING; + } + if (!$insert && $this->status == self::STATUS_UNCONFIRMED && $this->type == self::TYPE_SHOPPING) { $express = Yii::createObject([ 'class' => 'api\logic\ExpressLogic', ]); diff --git a/backend/views/layouts/main.php b/backend/views/layouts/main.php index d4e07a3..9be8095 100755 --- a/backend/views/layouts/main.php +++ b/backend/views/layouts/main.php @@ -31,7 +31,11 @@ AppAsset::register($this); beginBody() ?>
- + session->hasFlash('error') || Yii::$app->session->hasFlash('success')) { + echo Alert::widget(); + } + ?>
render('breadcrumb') ?>