Browse Source

fix: 调试修复运费计算的问题

wechat_public_accounts
iron 5 years ago
parent
commit
f1930e5fdc
  1. 4
      api/logic/AddressLogic.php
  2. 66
      api/logic/ExpressLogic.php
  3. 1
      api/logic/Helper.php
  4. 14
      api/logic/OrderLogic.php
  5. 11
      backend/modules/shop/models/ars/Order.php
  6. 6
      backend/views/layouts/main.php

4
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;
}

66
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 = $area->extra_price * ceil($count / $area->extra_count);
$amount = $weight;
}
return $amount;
} else {
if ($area->id == $areaId) {
$amount = $count - $area->basic_count > 0 ? $count - $area->basic_count : 0;
} else {
$amount = $count;
}
}
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('超出配送范围(未找到对应地区运费计算规则)');
}
/**

1
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) {

14
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获取订单

11
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',
]);

6
backend/views/layouts/main.php

@ -31,7 +31,11 @@ AppAsset::register($this);
<body class="hold-transition skin-blue-light sidebar-mini">
<?php $this->beginBody() ?>
<div class="wrapper">
<?php
if (Yii::$app->session->hasFlash('error') || Yii::$app->session->hasFlash('success')) {
echo Alert::widget();
}
?>
<div class="content">
<section class="content-header">
<?= $this->render('breadcrumb') ?>

Loading…
Cancel
Save