| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 |
- <?php
- namespace common\logic\order\marketing;
- use addons\Agent\common\models\Agent;
- use addons\Agent\common\models\AgentCommissionItemSetting;
- use common\enums\AddonsEnum;
- use common\enums\StatusEnum;
- use common\models\goods\Goods;
- use common\models\mall\MallAddons;
- use common\models\user\UserLevel;
- use Exception;
- use yii\helpers\Json;
- /**
- * 会员价
- * @Author bing
- * @DateTime 2021-09-27 19:07:32
- * @copyright: Copyright (c) 2020 广东七件事集团
- */
- class MemberPriceMarketing extends BaseMarketing
- {
- public function execute($form)
- {
- }
- public static function compute($item, &$form, &$extra)
- {
- try {
- $group_order_goods = $form['group_order_goods'];
- $mall_id = $form['mall_id'];
- $user_level = $form->user->level;
- $enable_goods_deduct = 0;// 商品是否参与了渠道分红
- //渠道分红,开启了内购-商品抵扣后,不再享受会员价
- if (MallAddons::isInstall($mall_id, AddonsEnum::ADDONS_NAME_AGENT)){
- $setting = \Yii::$app->services->setting->addons->get($mall_id, AddonsEnum::ADDONS_NAME_AGENT, 'basic');
- $agent = Agent::findOne(['user_id'=>$form['user_id'],'status'=>StatusEnum::ENABLED]);
- if (!empty($agent)&&!empty($setting['is_self_buy']) && !empty($setting['enable_goods_deduct'])) $enable_goods_deduct = 1;
- }
- if (empty($extra['user_level_model'])) {
- $user_level_model = UserLevel::getOne([['level' => $user_level],['mall_id' => $mall_id],['status'=>StatusEnum::ENABLED]], true);
- if(empty($user_level_model)) return $item;
- } else {
- $user_level_model = $extra['user_level_model'];
- }
- $discount = $user_level_model['discount'] ?? 10;
- if (empty($extra['goods_arr'])) {
- $goods_arr = self::getGoodListArr($group_order_goods);
- $extra['goods_arr'] = $goods_arr;
- } else {
- $goods_arr = $extra['goods_arr'];
- }
- if (empty($extra['total_deduct_money'])) {
- $total_deduct_money = 0;
- $extra['total_deduct_money'] = $total_deduct_money;
- } else {
- $total_deduct_money = $extra['total_deduct_money'];
- }
- $total_deduct_goods_price = 0;
- foreach ($item['goods'] as &$row) {
- $cha = 0;
- // 检测商品是否参与了渠道分红
- if ($enable_goods_deduct) {
- $item_setting = AgentCommissionItemSetting::find()->select('item_id,is_participate,is_self_buy_alone,is_self_buy,enable_goods_deduct')->where(['item_id' => $row['goods_id'], 'status' => StatusEnum::ENABLED])->asArray()->one();
- if (empty($item_setting) || !empty($item_setting['is_participate'])) continue;
- //独立设置内购
- if(!empty($item_setting['is_self_buy_alone'])){
- if (empty($item_setting['is_self_buy']) || empty($item_setting['enable_goods_deduct'])) continue;
- }
- }
- if (isset($goods_arr[$row['goods_id']]) && $goods_arr[$row['goods_id']]['extra']['is_member_price'] == 1) {
- //单独设置会员价
- $member_price_setting = Json::decode($goods_arr[$row['goods_id']]['extra']['member_price_setting']);
- if(!empty($form['sku'][$row['goods_id']]['goods']['is_attr'])){
- //多规格
- if (isset($member_price_setting['level' . $user_level])){
- $differences_money = 0; // 循环差额
- foreach ($row['goods_details'] as &$v) {
- if (isset($member_price_setting['level' . $user_level][$v['sign_id']])){
- $member_price = $member_price_setting['level' . $user_level][$v['sign_id']];
- if($v['price']>$member_price){
- if($member_price=='')$member_price = 0;
- $cha = ($v['price'] - $member_price) * $v['num'];//差额
- $cha = bcadd($cha, 0, 2);
- $differences_money = bcadd($differences_money, $cha, 2);
- $v['goods_price'] = bcsub($v['goods_price'], $cha, 2);
- $v['marketing']['member_price_deduct'] = $cha;
- $v['marketing']['pay_money'] = $v['goods_price'];
- }
- }
- }
- if ($differences_money>0) {
- $cha = bcadd(0, $differences_money, 2);
- $total_deduct_money = bcadd($total_deduct_money, $cha, 2);
- $total_deduct_goods_price = bcadd($total_deduct_goods_price, $cha, 2);
- }
- }
- }else{
- //默认规格
- if (!empty($member_price_setting[$user_level])){
- foreach ($row['goods_details'] as &$v) {
- if($v['price']>$member_price_setting[$user_level]) {
- $cha = 0;
- if(!empty($member_price_setting[$user_level])){
- if($member_price_setting[$user_level]=='')$member_price_setting[$user_level] = 0;
- $cha = ($v['price'] - $member_price_setting[$user_level]) * $v['num'];//差额
- }
- $cha = bcadd(0, $cha, 2);
- $total_deduct_money = bcadd($total_deduct_money, $cha, 2);
- $total_deduct_goods_price = bcadd($total_deduct_goods_price, $cha, 2);
- $v['goods_price'] = bcsub($v['goods_price'], $cha, 2);
- $v['marketing']['member_price_deduct'] = $cha;
- $v['marketing']['pay_money'] = $v['goods_price'];
- }
- }
- }
- }
- } else {
- //全局设置会员价
- if($goods_arr[$row['goods_id']]['extra']['is_member_price']==0){
- foreach ($row['goods_details'] as &$v) {
- $member_price = bcdiv(bcmul($v['price'], $discount, 2), 10, 2);
- if($v['price']>$member_price) {
- $cha = ($v['price'] - $member_price) * $v['num'];//差额
- $cha = bcadd(0, $cha, 2);
- $total_deduct_money = bcadd($total_deduct_money, $cha, 2);
- $total_deduct_goods_price = bcadd($total_deduct_goods_price, $cha, 2);
- $v['goods_price'] = bcsub($v['goods_price'], $cha, 2);
- $v['marketing']['member_price_deduct'] = $cha;
- $v['marketing']['pay_money'] = $v['goods_price'];
- }
- }
- }
- }
- $row['goods_price'] = bcsub($row['goods_price'], $cha, 2) ?? 0;
- }
- $total_deduct_money = bcadd(0, $total_deduct_money, 2);
- $item['mch_order_info']['goods_price'] = bcsub($item['mch_order_info']['goods_price'],$total_deduct_money,2);
- $form['group_order_goods'] = $group_order_goods;
- $form['total_pay_money'] = bcsub($form['total_pay_money'],$total_deduct_money,2);
- $prev_member_price = $form->marketing['deduct']['member_price']['money'] ?? 0;
- if ($total_deduct_money>0) $form->marketing['deduct']['member_price'] = ['name' => '会员优惠', 'money' => -bcsub($total_deduct_money, $prev_member_price, 2)];
- return $item;
- } catch (Exception $e) {
- self::setStaticError('会员价计算错误:' . $e->getMessage());
- return false;
- }
- }
- /**
- * @param $group_order_goods
- * @return array
- */
- public static function getGoodListArr($group_order_goods)
- {
- $gid_arr = [];
- array_map(function ($item) use (&$gid_arr) {
- array_map(function ($row) use (&$gid_arr) {
- $gid_arr[] = $row['goods_id'];
- }, $item['goods']);
- }, $group_order_goods);
- if (empty($gid_arr)) return [];
- $params = [
- 'where' => [['id' => $gid_arr]],
- 'with' => ['extra'],
- ];
- $goods_list = Goods::lists($params);
- $arr = [];
- array_map(function ($arg) use (&$arr) {
- $arr[$arg['id']] = $arg;
- }, $goods_list);
- return $arr;
- }
- }
|