You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
270 lines
9.9 KiB
270 lines
9.9 KiB
<?php |
|
|
|
namespace app\models; |
|
|
|
use app\models\common\admin\log\CommonActionLog; |
|
use Yii; |
|
|
|
/** |
|
* This is the model class for table "{{%postage_rules}}". |
|
* |
|
* @property integer $id |
|
* @property integer $store_id |
|
* @property string $name |
|
* @property integer $express_id |
|
* @property string $detail |
|
* @property integer $addtime |
|
* @property integer $is_enable |
|
* @property integer $is_delete |
|
* @property string $express |
|
*/ |
|
class PostageRules extends \yii\db\ActiveRecord |
|
{ |
|
/** |
|
* @inheritdoc |
|
*/ |
|
public static function tableName() |
|
{ |
|
return '{{%postage_rules}}'; |
|
} |
|
|
|
/** |
|
* @inheritdoc |
|
*/ |
|
public function rules() |
|
{ |
|
return [ |
|
[['store_id', 'name', 'express_id', 'detail', 'type'], 'required'], |
|
[['store_id', 'express_id', 'addtime', 'is_enable', 'is_delete', 'type'], 'integer'], |
|
[['detail'], 'string'], |
|
[['name', 'express'], 'string', 'max' => 255], |
|
]; |
|
} |
|
|
|
/** |
|
* @inheritdoc |
|
*/ |
|
public function attributeLabels() |
|
{ |
|
return [ |
|
'id' => 'ID', |
|
'store_id' => 'Store ID', |
|
'name' => '名称', |
|
'express_id' => '物流公司', |
|
'detail' => '规则详细', |
|
'addtime' => 'Addtime', |
|
'is_enable' => '是否启用:0=否,1=是', |
|
'is_delete' => 'Is Delete', |
|
'express' => '快递公司', |
|
'type' => '计费方式', |
|
]; |
|
} |
|
|
|
public function getExpress() |
|
{ |
|
return $this->hasOne(Express::className(), ['id' => 'express_id']); |
|
} |
|
|
|
public static function getExpressPrice($store_id, $city_id, $goods, $num, $province_id) |
|
{ |
|
if ($goods->freight != '0') { |
|
if (isset($goods->mch_id) && $goods->mch_id) { |
|
$postage_rules = MchPostageRules::findOne([ |
|
'is_delete' => 0, |
|
'id' => $goods->freight, |
|
'mch_id' => $goods->mch_id, |
|
]); |
|
} else { |
|
$postage_rules = PostageRules::findOne([ |
|
'store_id' => $store_id, |
|
'is_delete' => 0, |
|
'id' => $goods->freight, |
|
]); |
|
} |
|
} else { |
|
if (isset($goods->mch_id) && $goods->mch_id) { |
|
$postage_rules = MchPostageRules::findOne([ |
|
'is_delete' => 0, |
|
'is_enable' => 1, |
|
'mch_id' => $goods->mch_id, |
|
]); |
|
} else { |
|
$postage_rules = PostageRules::findOne([ |
|
'store_id' => $store_id, |
|
'is_delete' => 0, |
|
'is_enable' => 1, |
|
]); |
|
} |
|
} |
|
if (!$postage_rules) { |
|
return 0.00; |
|
} |
|
$price = 0.00; |
|
$list = json_decode($postage_rules->detail); |
|
$matching = null; |
|
foreach ($list as $i => $item) { |
|
$in_array = false; |
|
foreach ($item->province_list as $j => $province) { |
|
if ($province->id == $province_id || $province->id==$city_id) { |
|
$in_array = true; |
|
break; |
|
} |
|
} |
|
if ($in_array) { |
|
// $price = $item->price; |
|
// break; |
|
$matching = $list[$i]; |
|
} |
|
} |
|
if ($matching==null) { |
|
return 0; |
|
} |
|
if ($postage_rules->type == 1) { |
|
// 按重计费 |
|
$totalWeight = $goods->weight * $num; |
|
$totalWeight -= $matching->frist; |
|
$price += $matching->frist_price; |
|
$leave = $matching->second ? (ceil($totalWeight / $matching->second)>0?ceil($totalWeight / $matching->second):0) : 0; |
|
$price += $leave * $matching->second_price; |
|
} else { |
|
// 按件计费 |
|
$num -= $matching->frist; |
|
$price += $matching->frist_price; |
|
$leave = $matching->second ? (ceil($num / $matching->second)>0?ceil($num / $matching->second):0) : 0; |
|
$price += $leave * $matching->second_price; |
|
} |
|
return $price; |
|
} |
|
|
|
/** |
|
* 购物车结算 多种运费规则组合计算运费 |
|
* @param $store_id |
|
* @param $province_id |
|
* @param $goods |
|
* @return float|int |
|
*/ |
|
public static function getExpressPriceMore($store_id, $city_id, $goodsList, $province_id) |
|
{ |
|
$newGoodsList = []; |
|
foreach ($goodsList as $row) { |
|
if (isset($newGoodsList[$row['freight']])) { |
|
$newGoodsList[$row['freight']]['num'] += $row['num']; |
|
$newGoodsList[$row['freight']]['weight'] += $row['weight']; |
|
} else { |
|
$newGoodsList[$row['freight']] = $row; |
|
} |
|
} |
|
foreach ($newGoodsList as $key => $goods) { |
|
if ($goods['freight'] != '0') { |
|
if (isset($goods['mch_id']) && $goods['mch_id']) { |
|
$postage_rules = MchPostageRules::find()->andWhere([ |
|
'is_delete' => 0, |
|
'id' => $goods['freight'], |
|
'mch_id' => $goods['mch_id'], |
|
])->asArray()->one(); |
|
} else { |
|
$postage_rules = PostageRules::find()->andWhere([ |
|
'store_id' => $store_id, |
|
'is_delete' => 0, |
|
'id' => $goods['freight'], |
|
])->asArray()->one(); |
|
} |
|
} else { |
|
if (isset($goods['mch_id']) && $goods['mch_id']) { |
|
$postage_rules = MchPostageRules::find()->andWhere([ |
|
'is_delete' => 0, |
|
'is_enable' => 1, |
|
'mch_id' => $goods['mch_id'], |
|
])->asArray()->one(); |
|
} else { |
|
$postage_rules = PostageRules::find()->andWhere([ |
|
'store_id' => $store_id, |
|
'is_delete' => 0, |
|
'is_enable' => 1, |
|
])->asArray()->one(); |
|
} |
|
} |
|
|
|
if ($postage_rules) { |
|
$list = json_decode($postage_rules['detail']); |
|
$matching = null; |
|
foreach ($list as $i => $item) { |
|
$in_array = false; |
|
foreach ($item->province_list as $j => $province) { |
|
if ($province->id == $province_id || $province->id==$city_id) { |
|
$in_array = true; |
|
break; |
|
} |
|
} |
|
if ($in_array) { |
|
$matching = $list[$i]; |
|
} |
|
} |
|
$newGoodsList[$key]['type'] = $postage_rules['type']; |
|
$newGoodsList[$key]['matching'] = $matching; |
|
} |
|
} |
|
|
|
$maxFristPrice = 0; |
|
$maxFristPriceIndex = null; |
|
foreach ($newGoodsList as $k => $m) { |
|
if ($m['matching']->frist_price >= $maxFristPrice) { |
|
$maxFristPrice = $m['matching']->frist_price; |
|
$maxFristPriceIndex = $k; |
|
} |
|
} |
|
$price = 0.00; |
|
foreach ($newGoodsList as $key => $value) { |
|
if ($key == $maxFristPriceIndex) { |
|
if ($value['type'] == '1') { |
|
// 按重计费 |
|
$totalWeight = $value['weight']; |
|
$totalWeight -= $value['matching']->frist; |
|
$price += $value['matching']->frist_price; |
|
if ($value['matching']->second) { |
|
$leave = ceil($totalWeight / $value['matching']->second) > 0 ? ceil($totalWeight / $value['matching']->second) : 0; |
|
} else { |
|
$leave = 0; |
|
} |
|
$price += $leave * $value['matching']->second_price; |
|
} else { |
|
// 按件计费 |
|
$value['num'] -= $value['matching']->frist; |
|
$price += $value['matching']->frist_price; |
|
if ($value['matching']->second) { |
|
$leave = ceil($value['num'] / $value['matching']->second) > 0 ? ceil($value['num'] / $value['matching']->second) : 0; |
|
} else { |
|
$leave = 0; |
|
} |
|
$price += $leave * $value['matching']->second_price; |
|
} |
|
} else { |
|
if ($value['type'] == '1') { |
|
// 按重计费 |
|
$totalWeight = $value['weight']; |
|
if ($value['matching']->second) { |
|
$leave = ceil($totalWeight / $value['matching']->second) > 0 ? ceil($totalWeight / $value['matching']->second) : 0; |
|
} else { |
|
$leave = 0; |
|
} |
|
$price += $leave * $value['matching']->second_price; |
|
} else { |
|
// 按件计费 |
|
if ($value['matching']->second) { |
|
$leave = ceil($value['num'] / $value['matching']->second) > 0 ? ceil($value['num'] / $value['matching']->second) : 0; |
|
} else { |
|
$leave = 0; |
|
} |
|
$price += $leave * $value['matching']->second_price; |
|
} |
|
} |
|
} |
|
return $price; |
|
} |
|
|
|
public function afterSave($insert, $changedAttributes) |
|
{ |
|
$data = $insert ? json_encode($this->attributes) : json_encode($changedAttributes); |
|
CommonActionLog::storeActionLog('', $insert, $this->is_delete, $data, $this->id); |
|
} |
|
}
|
|
|