jh-admin/addon/saas/model/OrderPay.php

284 lines
15 KiB
PHP

<?php
/****
* 常规订单流水佣佣金计算
*/
namespace addon\saas\model;
use app\model\BaseModel;
use think\facade\Db;
class OrderPay extends BaseModel
{
/***
* 仅有指定产品有商户入驻奖励
* @param $orderInfo
* @return array|void
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function calculate($orderInfo = [])
{
$config_model = new Config();
$basic_config = $config_model->getBasicsConfig($orderInfo['site_id'])['data']['value']; //查询渠道商配置
if (empty($basic_config) || $basic_config['is_open'] == 0) return $this->success();
if (!$basic_config['goods_ids']) return $this->success();
//检查商品是否在管理商品账
if ($basic_config['settled_condition'] == 4) { //仅支持购买指定商品成为渠道
$manage_order_id = model('manage_order')->getValue([['order_id', '=', $orderInfo['order_id']]], 'id');//判断是否已结束
if ($manage_order_id) return $this->success();//已存在返回
$level_config = model('manage_level')->getColumn([['site_id', '=', $orderInfo['site_id']]], '*', 'level_id');
if (!$level_config) return $this->success();
$goods_ids = explode(',', $basic_config['goods_ids']);
$order_goods = model('order_goods')->getColumn([['order_id', '=', $orderInfo['order_id']]], '*', 'order_goods_id');//查询当前对应产品
if (array_intersect(array_column($order_goods, 'goods_id'), $goods_ids)) {
$manageInfo = Db::view('member m', 'member_id,source_member,username')
->view('manage_user a', 'id,level_id as one_level_id,real_name as one_real_name,parent,grand_parent,status,chain', 'a.member_id=m.source_member', 'left')
// ->view('manage_user b', 'level_id as two_level_id,real_name as two_real_name', 'a.parent=b.id', 'left')
// ->view('manage_user c', 'level_id as three_level_id,real_name as three_real_name', 'a.grand_parent=c.id', 'left')
->where('m.member_id', '=', $orderInfo['member_id'])
->find();//获取直推代理商
$levelInnfo = $level_config[$manageInfo['one_level_id']] ?? ''; //获取直推代理商等级
if (!$levelInnfo) return $this->success();
$new_level = [];
$district_level = [];//区域等级ID
$custom_weight = $levelInnfo['custom_weight'];//获取自定义上级权益归属
if ($level_config) {//计算上级等级规则
$custom_weight = explode(',', $custom_weight);//指定权益归属
foreach ($level_config as $k => $v) {
if ($v['upgrade_type'] == 0) {
$district_level[] = $v['level_id'];
}
if ($custom_weight && in_array($v['level_num'], $custom_weight)) {
foreach ($custom_weight as $level_num) {
if ($v['level_num'] == $level_num) {
$new_level[$k] = $v;
}
}
} else if ($v['level_num'] > $levelInnfo['level_num']) {
$new_level[$k] = $v;
}
}
}
$siteInfo = model('site')->getInfo([['site_id', '=', $orderInfo['site_id']]]);
$use_settle_number = $basic_config['use_settle_number'] ?: $orderInfo['order_money'];
$Statistics = [
'one_site_order_num' => 1,
'one_site_total_order' => $orderInfo['order_money'],
'one_site_order_money' => 0,
'use_settle_number' => round($orderInfo['order_money'] / $use_settle_number, 2)
];
$ladder_rewards = json_decode($levelInnfo['ladder_rewards'], true);//获取阶梯佣金
$ladder_rewards = array_column($ladder_rewards, null, 'order_money');
ksort($ladder_rewards);
$two_manage_id = 0;
$three_manage_id = 0;
$two_manage_info = []; //间推管理
$three_manage_info = [];//三级管理
$chain = $manageInfo['chain'];
$uids = array_filter(explode('#', $chain));
arsort($uids);
$w[] = ['site_id', '=', $orderInfo['site_id']];
$w[] = ['id', 'in', $uids];
$w[] = ['level_id', 'in', array_keys($new_level)];
$field = 'id,level_id,real_name';
$userInfo = model('manage_user')->getList($w, $field, 'depth_level desc,create_time desc');//计算上级贡献值比例
if ($userInfo) {
$temp_level_weight = '';
foreach ($userInfo as $v) {
$temp_info = $level_config[$v['level_id']] ?? '';
if ($two_manage_id == 0) {
$two_manage_id = $v['id'];
$two_manage_info = $v;
$temp_level_weight = $temp_info['level_num'];
}
if ($temp_info && $temp_info['level_num'] > $temp_level_weight) {
$three_manage_id = $v['id'];
$three_manage_info = $v;
break;
}
}
}
$district_where = [
['site_id', '=', $orderInfo['site_id']],
['district_id', '=', $orderInfo['district_id']],
['level_id', 'in', $district_level]
];
$district_info = model('manage_user')->getInfo($district_where, 'id,real_name');//区域
foreach ($order_goods as $k => $orderGoodsInfo) {
if (in_array($orderGoodsInfo['goods_id'], $goods_ids)) {
$amount = $orderGoodsInfo['price'] * $orderGoodsInfo['num'];
$ruleinfo = end($ladder_rewards);
//计算上级贡献值比例
if ($levelInnfo['reward_type'] == 2) {
foreach ($ladder_rewards as $mk => $v) {//获取当前满足的阶梯佣金
if ($amount <= $mk) {
$ruleinfo = $v;
break;
}
}
$one_rate = round($ruleinfo['direct_money'] / $amount, 2); //推荐人佣金
if ($ruleinfo['district_site_rate']) { //区域管理奖励
$basic_config['district_money'] = $ruleinfo['district_site_rate'];
}
$two_rate = 0;
$three_rate = 0; //佣金比例
$two_commission = 0; //未设置暂时为开发
$three_commission = 0; //三级佣金未开发
if ($ruleinfo['indirect_money']) { //间推贡献值
$two_rate = round($ruleinfo['indirect_money'] / $amount, 2); //间接人贡献值
$two_commission = $ruleinfo['indirect_money']; //间联贡献值
}
if ($three_manage_id && $ruleinfo['manage_site_rate']) {
$three_rate = round($ruleinfo['manage_site_rate'] / $amount, 2);
$three_commission = $ruleinfo['manage_site_rate'];
}
$one_commission = $ruleinfo['direct_money']; //直推佣金
$commission = $one_commission + $two_commission + $three_commission;
} else {
$one_rate = $levelInnfo['direct_site_rate'] ?? 0; //推荐人佣金
$two_rate = $levelInnfo['indirect_site_rate'] ?? 0; //间接人佣金
$three_rate = 0; //未设置暂时为开发
$one_commission = round($amount * $one_rate / 100, 2); //一级佣金
$two_commission = round($amount * $two_rate / 100, 2); //二级佣金
$three_commission = round($amount * $three_rate / 100, 2); //三级佣金
$commission = $one_commission + $two_commission + $three_commission;
$Statistics['one_site_order_money'] += $one_commission;
}
/***
* 城市服务商佣金奖励
*/
$province_rate = 0;
$city_rate = 0;
$district_rate = 0;
$province_commission = 0; //省佣金
$city_commission = 0; //市佣金
$district_commission = $basic_config['district_money'];
if (!$district_info) { //没有区域管理
$district_commission = 0;
}
$commission += $province_commission + $city_commission + $district_commission;
$commission_rate = ($one_rate + $two_rate + $three_rate + $province_rate + $city_rate + $district_rate) / 100;
$platform_commission = ($orderGoodsInfo['goods_money'] * config('accounts.platform_rate')) / 100; //平台官方手续费
//记录佣金数据
$addData = [
'order_id' => $orderInfo['order_id'],
'order_no' => $orderGoodsInfo['order_no'],
'out_trade_no' => $orderInfo['out_trade_no'],
'order_goods_id' => $orderGoodsInfo['order_goods_id'],
'site_id' => $orderInfo['site_id'],
'ag_site_id' => $siteInfo['agent_id'],
'site_name' => $siteInfo['site_name'],
'goods_id' => $orderGoodsInfo['order_goods_id'],
'sku_id' => $orderGoodsInfo['sku_id'],
'sku_name' => $orderGoodsInfo['sku_name'],
'sku_image' => $orderGoodsInfo['sku_image'],
'price' => $amount,
'num' => $orderGoodsInfo['num'],
'real_goods_money' => $orderGoodsInfo['goods_money'],
'member_id' => $orderGoodsInfo['member_id'],
'member_name' => $orderInfo['name'],
'member_mobile' => $orderInfo['mobile'],
'full_address' => $orderInfo['full_address'] . $orderInfo['address'],
'province_id' => $orderInfo['province_id'],
'city_id' => $orderInfo['city_id'],
'district_id' => $orderInfo['district_id'],
'promotion_type' => $orderInfo['promotion_type'] ?? '',
'promotion_type_name' => $orderInfo['promotion_type_name'] ?? '',
'one_manage_id' => $manageInfo['id'],
'two_manage_id' => $two_manage_id,
'three_manage_id' => $three_manage_id,
'commission' => $commission, //总佣金
'commission_rate' => $commission_rate,//总费率
'order_profit' => $amount - $commission - $platform_commission,//订单利润费率
'one_manage_name' => $manageInfo['one_real_name'] ?: '',
'two_manage_name' => $two_manage_info['real_name'] ?? '',
'three_manage_name' => $three_manage_info['real_name'] ?? '',
'one_commission' => $one_commission,
'two_commission' => $two_commission,
'three_commission' => $three_commission,
'province_commission' => $province_commission,
'city_commission' => $city_commission,
'district_commission' => $district_commission,
'one_rate' => $one_rate,
'two_rate' => $two_rate,
'three_rate' => $three_rate,
'trade_form' => 'site_trade',
'create_time' => time()
];
model("manage_order")->add($addData);
event('SaaSOrderProfit', $addData);
}
}
$this->addOrderStatistics($manageInfo['id'], $Statistics);
}
} else {
$this->getOrderGoods($orderInfo['site_id'], $orderInfo);
}
}
/***
* 添加普通订单统计
* @param $site_id
* @param $orderInfo
* @return void
* @throws \think\db\exception\DbException
*/
public function getOrderGoods($site_id, $orderInfo)
{
$siteInfo = model('site')->getInfo([['site_id', '=', $site_id]]);
if ($siteInfo['manage_id']) {
$Statistics = [
'one_site_order_num' => 1,
'one_site_total_order' => $orderInfo['order_money'],
'one_site_order_money' => 0,
];
$this->addOrderStatistics($siteInfo['manage_id'], $Statistics);
}
}
/***
* 添加订统计
* @param $mandege_id
* @param $data
* @return void
* @throws \think\db\exception\DbException
*/
public function addOrderStatistics($mandege_id, $data)
{
if (!empty($data['one_site_order_num'])) {
//添加订单数量
model('manage_user')->setInc([['id', '=', $mandege_id]], 'one_site_order_num');
}
if (!empty($manageInfo['one_site_total_order'])) {
//添加订单总额
model('manage_user')->setInc([['id', '=', $mandege_id]], 'one_site_total_order');
}
if (!empty($manageInfo['one_site_order_money'])) {
//添加获取订单佣金
model('manage_user')->setInc([['id', '=', $mandege_id]], 'one_site_order_money');
}
if (!empty($manageInfo['use_settle_number'])) {
//增加开店数量
model('manage_user')->setInc([['id', '=', $mandege_id]], 'use_settle_number', $manageInfo['use_settle_number']);
}
// 分销商检测升级
event('UpgradeManagelevel', $mandege_id);
}
}