145 lines
6.6 KiB
PHP
145 lines
6.6 KiB
PHP
<?php
|
|
/**
|
|
* SaaSMall商城系统 - 团队十年电商经验汇集巨献!
|
|
* =========================================================
|
|
* Copy right 2019-2029 成都SAAS云科技有限公司, 保留所有权利。
|
|
* ----------------------------------------------
|
|
* 官方网址: https://www.gobuysaas.com
|
|
* =========================================================
|
|
*/
|
|
|
|
namespace addon\store\model\settlement;
|
|
|
|
use app\model\BaseModel;
|
|
use addon\store\model\Config;
|
|
use addon\store\model\StoreAccount;
|
|
use app\model\store\Store;
|
|
|
|
class OrderSettlement extends BaseModel
|
|
{
|
|
|
|
/**
|
|
* 门店订单分成计算
|
|
* @param $data
|
|
*/
|
|
public function orderSettlementAccount($data)
|
|
{
|
|
$order_id = $data['order_id'];
|
|
$order_info = model('order')->getInfo([['order_id', '=', $order_id]]);
|
|
if (empty($order_info)) return null;
|
|
$store_id = $order_info['store_id'];
|
|
$site_id = $order_info['site_id'];
|
|
if (!$store_id) return null;
|
|
$config_model = new Config();
|
|
$config = $config_model->getStoreWithdrawConfig($site_id)['data']['value'] ?? [];
|
|
$is_settlement = $config['is_settlement'];//结算模式 todo 系统配置的门店计算开关是否会对门店结算开关造成影响
|
|
if ($is_settlement > 0) {
|
|
$store_model = new Store();
|
|
$store_condition = array(
|
|
['site_id', '=', $site_id],
|
|
['store_id', '=', $store_id]
|
|
);
|
|
$store_info = $store_model->getStoreInfo($store_condition)['data'] ?? [];
|
|
if ($store_info['aliapy_auto_settlement'] || $is_settlement == 3) return null;//如果是线上自动结算,则不进行计算
|
|
$is_settlement = $store_info['is_settlement'] ?? 0;
|
|
if ($is_settlement > 0) {
|
|
$store_settlement_rate = $store_info['settlement_rate'];
|
|
if ($store_settlement_rate > 0) {
|
|
$settlement_rate = $store_settlement_rate;
|
|
} else {
|
|
$settlement_rate = $config['settlement_rate'];
|
|
}
|
|
if ($settlement_rate > 0) {
|
|
$settlement_rate_calc = $settlement_rate / 100;//计算门店抽成比例
|
|
$order_money = $order_info['order_money'];
|
|
//todo 可能还有退款
|
|
$settlement_cost = $config['settlement_cost'];
|
|
$settlement_cost_array = explode(',', $settlement_cost);
|
|
$base_money = $order_money;
|
|
$base_money -= $order_info['refund_money'] ?? 0;//todo 这儿涉及到一个问题,退款的金额里面包含一部分余额,可能结算金额不太一致
|
|
$base_money = $base_money < 0 ? 0 : $base_money;
|
|
if (in_array('balance', $settlement_cost_array)) {
|
|
$balance_money = $order_info['balance_money'];
|
|
$base_money -= $balance_money;
|
|
}
|
|
if (in_array('point', $settlement_cost_array)) {
|
|
$point_money = $order_info['point_money'];
|
|
$base_money += $point_money;
|
|
}
|
|
if (in_array('fenxiao_commission', $settlement_cost_array)) {
|
|
$commission = $order_info['commission'];
|
|
$base_money -= $commission;
|
|
}
|
|
//优惠券比较特殊, 不过不扣除要价格优惠券抵扣金额加回去
|
|
if (!in_array('coupon', $settlement_cost_array)) {
|
|
$coupon_money = $order_info['coupon_money'];
|
|
$base_money += $coupon_money;
|
|
}
|
|
if ($base_money > 0) {
|
|
$store_commission_rate = $settlement_rate;
|
|
$store_commission = round($base_money * $settlement_rate_calc, 2);
|
|
$order_data = array(
|
|
'store_commission_rate' => $store_commission_rate,
|
|
'store_commission' => $store_commission
|
|
);
|
|
$order_condition = array(
|
|
['order_id', '=', $order_id]
|
|
);
|
|
model('order')->update($order_data, $order_condition);
|
|
$store_account_model = new StoreAccount();
|
|
//门店账户金额增加
|
|
$store_account_data = array(
|
|
'account_data' => $store_commission,
|
|
'site_id' => $site_id,
|
|
'store_id' => $store_id,
|
|
'from_type' => 'order',
|
|
'remark' => '订单完成,门店抽成金额' . $store_commission,
|
|
'related_id' => $order_id
|
|
);
|
|
$store_account_model->addStoreAccount($store_account_data);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 用户退款退还佣金
|
|
* @param $data
|
|
* @return void
|
|
*/
|
|
public function orderRefundSettlementAccount($data)
|
|
{
|
|
$order_goods_id = $data['order_goods_id'];
|
|
$order_goods_info = model('order_goods')->getInfo([['order_goods_id', '=', $order_goods_id]]);
|
|
if (empty($order_goods_info))
|
|
return null;
|
|
|
|
$order_id = $order_goods_info['order_id'];
|
|
$order_info = model('order')->getInfo([['order_id', '=', $order_id]]);
|
|
if (empty($order_info))
|
|
return null;
|
|
|
|
$site_id = $order_info['site_id'];
|
|
$store_id = $order_info['store_id'];
|
|
$order_scene = $order_info['order_scene'];
|
|
//只有收银台订单会有这种情况
|
|
if ($store_id == 0 || $order_scene != 'cashier') return null;
|
|
$refund_money = $order_goods_info['refund_real_money'];
|
|
$order_money = $order_info['order_money'];
|
|
$store_commission = $order_info['store_commission'];
|
|
$refund_store_commission = round($store_commission * ($refund_money / $order_money), 2);
|
|
$store_account_model = new StoreAccount();
|
|
//门店账户金额增加
|
|
$store_account_data = array(
|
|
'account_data' => -$refund_store_commission,
|
|
'site_id' => $site_id,
|
|
'store_id' => $store_id,
|
|
'from_type' => 'refund',
|
|
'remark' => '订单退款,门店抽成金额扣除' . $refund_store_commission,
|
|
'related_id' => $order_goods_id,
|
|
'is_limit' => 0
|
|
);
|
|
$store_account_model->addStoreAccount($store_account_data);
|
|
}
|
|
} |