| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404 |
- <?php
- namespace addons\Happiness\common\logic\order;
- use addons\Happiness\common\enums\HappinessEnum;
- use addons\Happiness\common\enums\HappinessRewardEnum;
- use addons\Happiness\common\models\HappinessAgent;
- use addons\Happiness\common\models\HappinessBusiness;
- use addons\Happiness\common\models\HappinessGoods;
- use addons\Happiness\common\models\HappinessGoodsRanking;
- use addons\Happiness\common\models\HappinessOrder;
- use addons\Happiness\common\models\HappinessStoreCommission;
- use addons\Happiness\common\models\HappinessStoreUser;
- use addons\Happiness\common\models\HappinessStore;
- use addons\Happiness\common\models\HappinessStoreCensus;
- use addons\Happiness\common\models\HappinessStoreGoods;
- use addons\Happiness\common\models\HappinessStoreGoodsAttr;
- use addons\Happiness\common\models\HappinessStoreStatistics;
- use addons\Happiness\common\service\CommissionService;
- use addons\Happiness\common\service\LockUserService;
- use common\enums\OrderStatusEnum;
- use common\enums\ShippingTypeEnum;
- use common\enums\StatusEnum;
- use common\models\order\OrderMarketing;
- use Exception;
- class OrderLogic
- {
- //记录门店会员信息
- public function setUserData($params, $order)
- {
- try {
- //查询门店是否已存在该用户信息
- $user_info = HappinessStoreUser::getOne([
- ['mall_id' => $params['mall_id']],
- ['user_id' => $params['user_id']],
- ['store_id' => $params['store_id']],
- ]);
- $is_add = false;
- if (empty($user_info)) {
- $user_info = new HappinessStoreUser();
- $user_info->mall_id = $params['mall_id'];
- $user_info->user_id = $params['user_id'];
- $user_info->store_id = $params['store_id'];
- $user_info->loadDefaultValues();
- $is_add = true;
- }
- $user_info->last_time = $order['pay_time'];
- $user_info->order_nums += 1;
- $user_info->pay_nums += 1;
- $user_info->pay_money += $order['pay_money'];
- if (!$user_info->save()) throw new Exception('记录门店会员信息失败');
- if ($is_add) {
- //维护门店数据
- HappinessStore::updateAllCounters(['user_nums' => 1], ['mall_id' => $params['mall_id'], 'id' => $params['store_id']]);
- HappinessStoreCensus::setData([
- 'mall_id' => $params['mall_id'],
- 'store_id' => $params['store_id'],
- 'add_user_nums' => 1,
- 'date_time' => date('Y-m-d', time()),
- ]);
- }
- return true;
- } catch (\Exception $e) {
- var_dump($e->getMessage());
- \Yii::error($e->getMessage());
- throw new Exception($e->getMessage());
- }
- }
- //记录门店订单收益
- public function setStoreCommission($params, $order)
- {
- $trans = \Yii::$app->db->beginTransaction();
- try {
- //获取幸福小店基础配置
- $setting = \Yii::$app->services->setting->addons->get($params['mall_id'], HappinessEnum::ADDONS_NAME, 'basic');
- $commission_params = [
- 'mall_id' => $params['mall_id'],
- 'store_id' => $params['store_id'],
- 'user_id' => $params['user_id'],
- 'order_no' => $order['order_no'],
- 'order_money' => $order['goods_price'],
- 'pay_money' => $order['pay_money'],
- 'discount_money' => bcsub($order['original_goods_price'], $order['goods_price'], 2),
- 'is_settlement' => 0,
- 'status' => 1,
- 'settle_type' => $setting['settle_type'],
- 'score_money' => $order['score_money'] ?? 0,
- 'type'=>$params['type']??1,
- ];
- $service_charge = 0;
- $setting['settle_type']=2;
- switch ($setting['settle_type']) {
- case 1: //门店商品售价
- $amount_received = $order['original_goods_price'];
- break;
- case 2: //订单实际支付
- $amount_received = $order['pay_money'];
- break;
- case 3: //商品成本+运费
- $amount_received = array_sum(array_column($order['detail'], 'cost_price')) + $order['shipping_money'];
- break;
- case 4: //订单实际支付+积分抵扣
- $amount_received = $order['pay_money'] + $order['score_money'];
- break;
- }
- $store_total_commission=0;
- foreach ($order['detail'] as $key => $value) {
- //库存扣减
- $happiness_goods_attr = HappinessStoreGoodsAttr::getOne([
- ['mall_id' => $params['mall_id']],
- ['store_id' => $params['store_id']],
- ['attr_id' => $value['goods_attr_id']],
- ['status' => StatusEnum::ENABLED],
- ['is_on_sale' => 1],
- ]);
- $happiness_goods_attr->stock -= $value['num'];
- $happiness_goods_attr->save();
- $happiness_goods = HappinessStoreGoods::getOne([
- ['mall_id' => $params['mall_id']],
- ['store_id' => $params['store_id']],
- ['goods_id' => $value['goods_id']],
- ['status' => StatusEnum::ENABLED],
- ['is_on_sale' => 1],
- ]);
- $happiness_goods->stock -= $value['num'];
- $happiness_goods->sales_num += $value['num'];
- $happiness_goods->save();
- $happiness_goods=HappinessGoods::getOne([
- ['mall_id' => $params['mall_id']],
- ['goods_id' => $value['goods_id']],
- ['status' => StatusEnum::ENABLED],
- ['is_on_sale' => 1],
- ]);
- if(empty($happiness_goods))
- {
- //取最后一条数据
- $happiness_goods=HappinessGoods::find()->where(['mall_id' => $params['mall_id'],'goods_id' =>
- $value['goods_id']])->orderBy('id desc')->one();
- }
- $store_scale=bcdiv($happiness_goods->store_scale,100,4);
- $goods_price=bcmul($value['goods_price'],$store_scale,2);
- $store_total_commission =bcadd($goods_price,$store_total_commission,2);
- //维护商品销量数据
- HappinessGoods::updateAllCounters(['sales_num' => $value['num']], ['mall_id' => $params['mall_id'], 'goods_id' => $value['goods_id']]);
- HappinessGoodsRanking::setData([
- 'mall_id' => $params['mall_id'],
- 'store_id' => $params['store_id'],
- 'goods_id' => $value['goods_id'],
- 'sales_money' => $value['goods_price'],
- 'status' => StatusEnum::ENABLED,
- ]);
- }
- if ($setting['service_fee'] == 1) $service_charge = bcmul($store_total_commission, $setting['platform_ratio']/100, 2);
- $amount_received = bcsub($store_total_commission, $service_charge, 2);
- $commission_params['all_commission'] = $store_total_commission;//总佣金
- $commission_arr=[];//佣金计算
- //扣除店主分享和用户分享收益
- $share_commission=0;
- $commission_params['store_share_commission'] =0;
- $commission_params['share_commission'] =0;
- $commission_params['store_scale']=$setting['store_share_scale'];
- if (!empty($params['parent_id'])) {
- $store_parent = HappinessStore::findOne([
- ['mall_id' => $params['mall_id']],
- ['user_id' => $params['parent_id']],
- ['status' => StatusEnum::ENABLED],
- ]);
- if($store_parent && !empty($setting['store_share_scale']) && $params['store_id'] == $store_parent['id'])
- {
- //店主分享收益
- $share_commission=bcmul($order['pay_money'], bcdiv($setting['store_share_scale'],100,4), 2);
- $commission_params['store_share_commission']=$share_commission;
- $commission_arr[]=[
- 'user_id'=>$store_parent['user_id'],
- 'money'=>$share_commission,
- 'order_id'=>$order['id'],
- 'order_no'=>$order['order_no'],
- 'commission_type'=>HappinessRewardEnum::COMMISSION_TYPE_SHARE,
- 'commission_status'=>HappinessRewardEnum::NO_SETTLE,
- 'remark'=>'用户('.$store_parent['user_id'].')(店主)获得小店分享收益',
- 'store_id'=>$params['store_id'],
- 'mall_id'=>$params['mall_id'],
- 'order_money' => $order['pay_money'],
- ];
- }
- else
- {
- //用户分享收益
- $share_commission=bcmul($order['pay_money'], bcdiv($setting['share_scale'],100,4), 2);
- $commission_arr[]=[
- 'user_id'=>$params['parent_id'],
- 'money'=>$share_commission,
- 'order_id'=>$order['id'],
- 'order_no'=>$order['order_no'],
- 'commission_type'=>HappinessRewardEnum::COMMISSION_TYPE_SHARE,
- 'commission_status'=>HappinessRewardEnum::NO_SETTLE,
- 'remark'=>'用户('.$params['parent_id'].')获得小店分享收益',
- 'store_id'=>$params['store_id'],
- 'mall_id'=>$params['mall_id'],
- 'order_money' => $order['pay_money'],
- ];
- }
- }
- $amount_received=bcsub($amount_received,$share_commission,2);
- $commission_params['amount_received'] = $amount_received;//小店实收货款 //需要扣除店主分享和用户分享收益
- $commission_params['service_charge'] = $service_charge;
- $commission_params['platform_ratio'] = $setting['platform_ratio'];
- $commission_params['share_commission'] = $share_commission;
- $commissionService=new CommissionService(['mall_id' => $params['mall_id']]);
- $commission_arr2=$commissionService->calculateAndRecord($order,$params);
- $commission_arr=array_merge($commission_arr,$commission_arr2);
- //维护门店数据
- HappinessStore::updateAllCounters(['total_order_money' => $order['pay_money'], 'total_num' => 1, 'unsettled_amount' => $commission_params['amount_received']], ['mall_id' => $params['mall_id'], 'id' => $params['store_id']]);
- //记录佣金记录
- if(!empty($commission_arr))
- {
- foreach ($commission_arr as $value)
- {
- $res=$commissionService->record($value);
- if($res===false)
- {
- throw new \Exception($commissionService->getError());
- }
- }
- }
- $res = HappinessStoreCommission::setData($commission_params);
- if (!$res) throw new Exception(HappinessStoreCommission::$static_error);
- //记录每日数据
- $res = HappinessStoreCensus::setData([
- 'mall_id' => $params['mall_id'],
- 'store_id' => $params['store_id'],
- 'order_nums' => 1,
- 'sales_money' => $order['pay_money'],
- 'date_time' => date('Y-m-d', time()),
- ]);
- if (!$res) throw new Exception(HappinessStoreCensus::$static_error);
- $trans->commit();
- return true;
- } catch (\Exception $e) {
- $trans->rollBack();
- \Yii::error($e->getMessage().$e->getFile());
- throw new Exception($e->getMessage());
- }
- }
- //解冻收益
- public function frozeCommission($params, $order)
- {
- try {
- $froze_commission_data = HappinessStoreCommission::getOne([
- ['mall_id' => $params['mall_id']],
- ['store_id' => $params['store_id']],
- ['order_no' => $order['order_no']],
- ['is_settlement' => 0],
- ]);
- if (empty($froze_commission_data)) throw new Exception('查无此收益数据');
- $froze_commission_data->is_settlement = 1;
- //获取门店信息
- $store_info = HappinessStore::getOne([
- ['mall_id' => $params['mall_id']],
- ['id' => $params['store_id']],
- ]);
- if (empty($store_info)) throw new Exception('查无此门店');
- $store_info->total_money += $froze_commission_data->amount_received;
- $store_info->balance += $froze_commission_data->amount_received;
- $store_info->total_settled_amount += $froze_commission_data->amount_received;
- $store_info->unsettled_amount -= $froze_commission_data->amount_received;
- if (!$froze_commission_data->save()) throw new Exception('维护收益数据失败');
- if (!$store_info->save()) throw new Exception('维护门店数据失败');
- HappinessStoreStatistics::updateIncomeMoney($store_info, $froze_commission_data->amount_received);
- //记录每日数据
- HappinessStoreCensus::setData([
- 'mall_id' => $params['mall_id'],
- 'store_id' => $params['store_id'],
- 'date_time' => date('Y-m-d', time()),
- 'settlement_commission' => $froze_commission_data->amount_received,
- ]);
- //记录门店店主小店收益
- $commissionService=new CommissionService(['mall_id' => $params['mall_id']]);
- $store_user_id=HappinessStore::findOne(['mall_id' => $params['mall_id'], 'id' => $params['store_id']])['user_id'];
- $res=$commissionService->statsItem( [
- 'mall_id' => $params['mall_id'],
- 'store_id' => $params['store_id'],
- 'order_id' => $order['id'],
- 'order_no' => $order['order_no'],
- 'order_money' => $order['pay_money'],
- 'user_id' => $store_user_id,
- 'money'=>$froze_commission_data->amount_received
- ],'store_money');
- if (!$res) throw new Exception($commissionService->getError());
- return true;
- } catch (\Exception $e) {
- \Yii::error($e->getMessage());
- throw new Exception($e->getMessage());
- }
- }
- //售后维护订单数据
- public function refundChangeData($params, $order_detail, $order)
- {
- $trans = \Yii::$app->db->beginTransaction();
- try {
- //获取收益信息
- $commission_data = HappinessStoreCommission::getOne([
- ['mall_id' => $params['mall_id']],
- ['store_id' => $params['store_id']],
- ['order_no' => $order['order_no']],
- ['is_settlement' => 0],
- ]);
- if (empty($commission_data)) throw new Exception('查无此收益信息');
- //获取门店信息
- $store_info = HappinessStore::getOne([
- ['mall_id' => $params['mall_id']],
- ['id' => $params['store_id']],
- ]);
- //获取下单用户信息
- $user_info = HappinessStoreUser::getOne([
- ['mall_id' => $params['mall_id']],
- ['user_id' => $params['user_id']],
- ['store_id' => $params['store_id']],
- ]);
- //如果订单已完全售后完成
- if ($order['is_feedback'] == 2) {
- $store_info->unsettled_amount -= $commission_data->amount_received;
- $store_info->total_num -= 1;
- $store_info->total_order_money -= $commission_data->amount_received;
- $user_info->refund_nums += 1;
- $user_info->refund_money += $order['pay_money'];
- $commission_data->is_settlement = -1;
- } else {
- //获取marketing数据
- $order_marketing = OrderMarketing::getOne([
- ['order_detail_id' => $order_detail['id']]
- ]);
-
- // $user_info->refund_money += $order_detail['goods_price'];
- switch ($commission_data->settle_type) {
- case 1: //门店商品售价
- $amount_received = $order_detail['original_goods_price'];
- break;
- case 2: //订单实际支付
- $amount_received = $order_detail['goods_price'];
- break;
- case 3: //商品成本+运费
- $amount_received = $order_detail['cost_price'];
- break;
- case 4: //订单实际支付+积分抵扣
- $score_money = 0;
- if (!empty($order_marketing['deduct_currency'])) $score_money = $order_marketing['deduct_currency']['score']['money'];
- $amount_received = bcadd($order_detail['goods_price'], $score_money, 2);
- break;
- }
- if ($commission_data->service_charge > 0) {
- $service_charge = bcmul($amount_received, $commission_data->platform_ratio/100, 2);
- $amount_received = bcsub($amount_received, $service_charge, 2);
- }
- $commission_data->amount_received -= $amount_received;
- $store_info->unsettled_amount -= $amount_received;
- $store_info->total_order_money -= $amount_received;
- }
- if (!$commission_data->save()) throw new Exception('维护资金数据失败');
- if (!$user_info->save()) throw new Exception('维护门店用户数据失败');
- if (!$store_info->save()) throw new Exception('维护门店数据失败');
- //库存退回
- $happiness_goods_attr = HappinessStoreGoodsAttr::getOne([
- ['mall_id' => $params['mall_id']],
- ['store_id' => $params['store_id']],
- ['attr_id' => $order_detail['goods_attr_id']],
- ['status' => StatusEnum::ENABLED],
- ['is_on_sale' => 1],
- ]);
- $happiness_goods_attr->stock += $order_detail['num'];
- $happiness_goods_attr->save();
- $happiness_goods = HappinessStoreGoods::getOne([
- ['mall_id' => $params['mall_id']],
- ['store_id' => $params['store_id']],
- ['goods_id' => $order_detail['goods_id']],
- ['status' => StatusEnum::ENABLED],
- ['is_on_sale' => 1],
- ]);
- $happiness_goods->stock += $order_detail['num'];
- $happiness_goods->save();
- $trans->commit();
- return true;
- } catch (\Exception $e) {
- $trans->rollBack();
- throw new Exception($e->getMessage());
- }
- }
- }
|