分銷計算

h888
Wayne 3 years ago
parent 4466400bc1
commit 35e2d9d621

@ -483,6 +483,13 @@ class Order extends ApiController
return $this->Error('更新失敗'); return $this->Error('更新失敗');
} }
} elseif ($params['op'] == 'finish') { } elseif ($params['op'] == 'finish') {
//訂單完成,計算分銷
$res = \app\common\Affiliate::calculateProfitShare($order);
if ($res['code'] > 0) {
return $this->Error('計算分銷失敗,請重新操作');
}
$arr['order_id'] = $order['order_id']; $arr['order_id'] = $order['order_id'];
$arr['order_status'] = OS_FINISHED; $arr['order_status'] = OS_FINISHED;
$arr['pay_status'] = PS_PAYED; $arr['pay_status'] = PS_PAYED;

@ -1,310 +1,237 @@
<?php <?php
namespace app\appapi\controller\v1; namespace app\appapi\controller\v1;
use app\appapi\ApiController; use app\appapi\ApiController;
use think\facade\Db; use think\facade\Db;
use think\facade\Log; use think\facade\Log;
use app\common\payment\Payment as PaymentStrategy; use app\common\payment\Payment as PaymentStrategy;
class Payment extends ApiController class Payment extends ApiController
{ {
public function getPayments() public function getPayments()
{ {
$res = Db::name('payment') $res = Db::name('payment')
->where('enabled', 1) ->where('enabled', 1)
->select(); ->select();
if (!$res) { if (!$res) {
return $this->Error('錯誤請求'); return $this->Error('錯誤請求');
} }
return $this->Success($res); return $this->Success($res);
} }
public function process() public function process()
{ {
//從order info 取出訂單資料 //從order info 取出訂單資料
$rtn = Db::name('order_info') $rtn = Db::name('order_info')
->where('order_sn', input('order_sn')) ->where('order_sn', input('order_sn'))
->find(); ->find();
if (!$rtn) { if (!$rtn) {
return $this->Error('錯誤請求'); return $this->Error('錯誤請求');
} }
$rtn['address'] = json_decode($rtn['address'], true); $rtn['address'] = json_decode($rtn['address'], true);
$order = [ $order = [
'order_sn' => input('order_sn'), 'order_sn' => input('order_sn'),
'order_amount' => $rtn['order_amount'], 'order_amount' => $rtn['order_amount'],
'goods_amount' => $rtn['goods_amount'], 'goods_amount' => $rtn['goods_amount'],
'mobile' => $rtn['mobile'], 'mobile' => $rtn['mobile'],
'consignee' => $rtn['consignee'], 'consignee' => $rtn['consignee'],
'email' => $rtn['email'], 'email' => $rtn['email'],
'zipcode' => isset($rtn['address']['zipcode']) ? $rtn['address']['zipcode'] : '', 'zipcode' => isset($rtn['address']['zipcode']) ? $rtn['address']['zipcode'] : '',
'goods_list' => Db::name('order_goods')->where('order_id', $rtn['order_id'])->select()->toArray(), 'goods_list' => Db::name('order_goods')->where('order_id', $rtn['order_id'])->select()->toArray(),
]; ];
$payment = new PaymentStrategy(input('pay_code')); $payment = new PaymentStrategy(input('pay_code'));
$result = $payment->pay($order); $result = $payment->pay($order);
return $this->Success($result); return $this->Success($result);
} }
//金流回傳網址 //金流回傳網址
public function response() public function response()
{ {
$data = input(); $data = input();
$payment = new PaymentStrategy(input('paycode')); $payment = new PaymentStrategy(input('paycode'));
/* 傳入回傳資料,返回result /* 傳入回傳資料,返回result
** $result['code'] = 200 ** $result['code'] = 200
** $result['msg'] = '付款成功' ** $result['msg'] = '付款成功'
** $result['order_sn'] = '訂單編號' ** $result['order_sn'] = '訂單編號'
** $result['paycode'] = '金流代碼' ** $result['paycode'] = '金流代碼'
*/ */
$result = $payment->response($data); $result = $payment->response($data);
switch ($result['paycode']) { switch ($result['paycode']) {
case 'eccredit': case 'eccredit':
if ($result['code'] == 200) { if ($result['code'] == 200) {
//判斷是否為超商取貨付款 //判斷是否為超商取貨付款
$order = Db::name('order_info') $order = Db::name('order_info')
->where('order_sn', $result['order_sn']) ->where('order_sn', $result['order_sn'])
->find(); ->find();
$shipping_code = Db::name('shipping')->where('shipping_id', $order['shipping_id'])->value('shipping_code'); $shipping_code = Db::name('shipping')->where('shipping_id', $order['shipping_id'])->value('shipping_code');
if ($shipping_code == 'ecpay') { if ($shipping_code == 'ecpay') {
$rtn = \app\common\shipping\Shipping::createShipping('ecpay', $order['order_sn']); $rtn = \app\common\shipping\Shipping::createShipping('ecpay', $order['order_sn']);
if ($rtn['code'] != 200) { if ($rtn['code'] != 200) {
$code = 200; $code = 200;
$result['msg'] .= ',建立物流單失敗'; $result['msg'] .= ',建立物流單失敗';
//TODO: 通知管理員物流單建立失敗 //TODO: 通知管理員物流單建立失敗
} }
} }
//判斷是否為SlashCard商品 //判斷是否為SlashCard商品
$is_main = Db::name('order_goods') $is_main = Db::name('order_goods')
->where('order_id', $order['order_id']) ->where('order_id', $order['order_id'])
->where('goods_id', 1) ->where('goods_id', 1)
->find(); ->find();
if ($is_main) { if ($is_main) {
$rtn = \app\service\Card::addUser([ $rtn = \app\service\Card::addUser([
'order_sn' => $order['order_sn'], 'order_sn' => $order['order_sn'],
'user_id' => Db::name('users')->where('user_id', $order['user_id'])->value('sso_user_id'), 'user_id' => Db::name('users')->where('user_id', $order['user_id'])->value('sso_user_id'),
]); ]);
if ($rtn['code'] != 200) { if ($rtn['code'] != 200) {
$code = 200; $code = 200;
$result['msg'] .= ',建立卡片失敗'; $result['msg'] .= ',建立卡片失敗';
//TODO: 通知管理員建立卡片失敗 //TODO: 通知管理員建立卡片失敗
} else { } else {
//更改會員的狀態 //更改會員的狀態
Db::name('users')->where('user_id', $order['user_id'])->update(['is_validated' => 1]); Db::name('users')->where('user_id', $order['user_id'])->update(['is_slash' => 1]);
$code = 200; $code = 200;
} }
} }
} else {
//分潤獎金計算 //付款失敗
//取得介紹人user_id $code = $result['code'];
//分銷金額 $result['msg'] .= ',付款失敗';
try { }
//找出第一二三四層介紹人 break;
$sso_user_id = Db::name('users')->where('user_id', $order['user_id'])->value('sso_user_id'); default:
$parents = $this->getAffiliate($sso_user_id, 1); break;
}
foreach ($parents as $key => $value) { //回傳成功並且不為超商支付及atm
//TODO: 金額改為後台設定
$money = [400, 50, 30, 20]; $query_string = http_build_query($result);
return redirect(getUrl() . '/m/cartFinish/?' . $query_string);
//寫入affiliate_log }
$affiliate_log = [
'user_id' => Db::name('users')->where('sso_user_id', $value)->value('user_id'), //金流回傳網址
'order_id' => $order['order_id'], public function callback()
'time' => time(), {
'user_name' => Db::name('users')->where('sso_user_id', $value)->value('real_name'), Log::write(json_encode(input()));
'money' => $money[$key], $data = input('post.');
];
Db::name('affiliate_log')->insert($affiliate_log); $payment = new PaymentStrategy(input('paycode'));
//增加介紹人的獎金
Db::name('users')->where('sso_user_id', $value)->inc('frozen_money', $money[$key])->update(); /* 傳入回傳資料,返回result
} ** $result['code'] = 200
} catch (\Exception $e) { ** $result['msg'] = '付款成功'
print_r($e->getMessage()); ** $result['order_sn'] = '訂單編號'
$code = 200; ** $result['paycode'] = '金流代碼'
$result['msg'] .= ',分潤失敗'; */
}
}else{ $result = $payment->callback($data);
//付款失敗
$code = $result['code']; if ($result['code'] == 200) {
$result['msg'] .= ',付款失敗'; //判斷是否為超商取貨付款
} $order = Db::name('order_info')
break; ->where('order_sn', $result['order_sn'])
default: ->find();
break;
} $shipping_code = Db::name('shipping')->where('shipping_id', $order['shipping_id'])->value('shipping_code');
//回傳成功並且不為超商支付及atm
if ($shipping_code == 'ecpay') {
$query_string = http_build_query($result); $rtn = \app\common\shipping\Shipping::createShipping('ecpay', $order['order_sn']);
return redirect(getUrl() . '/m/cartFinish/?' . $query_string); if ($rtn['code'] != 200) {
} $code = 200;
$result['msg'] .= ',建立物流單失敗';
//金流回傳網址 //TODO: 通知管理員物流單建立失敗
public function callback() }
{ }
Log::write(json_encode(input()));
$data = input('post.'); //判斷是否為SlashCard商品
$is_main = Db::name('order_goods')
$payment = new PaymentStrategy(input('paycode')); ->where('order_id', $order['order_id'])
->where('goods_id', 1)
/* 傳入回傳資料,返回result ->find();
** $result['code'] = 200
** $result['msg'] = '付款成功' if ($is_main) {
** $result['order_sn'] = '訂單編號' $rtn = \app\service\Card::addUser([
** $result['paycode'] = '金流代碼' 'order_sn' => $order['order_sn'],
*/ 'user_id' => Db::name('users')->where('user_id', $order['user_id'])->value('sso_user_id'),
]);
$result = $payment->callback($data); if ($rtn['code'] != 200) {
$code = 200;
if ($result['code'] == 200) { $result['msg'] .= ',建立卡片失敗';
//判斷是否為超商取貨付款 //TODO: 通知管理員建立卡片失敗
$order = Db::name('order_info') } else {
->where('order_sn', $result['order_sn']) //更改會員的狀態
->find(); Db::name('users')->where('user_id', $order['user_id'])->update(['is_validated' => 1]);
$code = 200;
$shipping_code = Db::name('shipping')->where('shipping_id', $order['shipping_id'])->value('shipping_code'); }
}
if ($shipping_code == 'ecpay') { }
$rtn = \app\common\shipping\Shipping::createShipping('ecpay', $order['order_sn']); return '1|OK';
if ($rtn['code'] != 200) { }
$code = 200;
$result['msg'] .= ',建立物流單失敗'; public function cancel()
//TODO: 通知管理員物流單建立失敗 {
} Log::write('金流取消');
} echo "金流取消";
}
//判斷是否為SlashCard商品
$is_main = Db::name('order_goods') public function otpError()
->where('order_id', $order['order_id']) {
->where('goods_id', 1) $data = input();
->find(); $order_sn = $data['order_sn'];
if ($is_main) { $order = Db::name('order_info')
$rtn = \app\service\Card::addUser([ ->where('order_sn', $order_sn)
'order_sn' => $order['order_sn'], ->find();
'user_id' => Db::name('users')->where('user_id', $order['user_id'])->value('sso_user_id'),
]); $result['pay_status'] = '3';
if ($rtn['code'] != 200) { $code = 500;
$code = 200; $message = 'OTP驗證失敗';
$result['msg'] .= ',建立卡片失敗';
//TODO: 通知管理員建立卡片失敗 try {
} else { //更新訂單狀態
//更改會員的狀態 Db::name('order_info')
Db::name('users')->where('user_id', $order['user_id'])->update(['is_validated' => 1]); ->where('order_sn', $order_sn)
$code = 200; ->update($result);
}
} //更新訂單操縱紀錄
$order_action = [
//分潤獎金計算 'order_id' => $order['order_id'],
//取得介紹人user_id 'action_user' => '綠界科技',
//分銷金額 'order_status' => $order['order_status'],
try { 'shipping_status' => $order['shipping_status'],
//找出第一二三四層介紹人 'pay_status' => $order['pay_status'],
$sso_user_id = Db::name('users')->where('user_id', $order['user_id'])->value('sso_user_id'); 'action_note' => '綠界金流: 信用卡支付,' . $message,
$parents = $this->getAffiliate($sso_user_id, 1); 'log_time' => time(),
];
foreach ($parents as $key => $value) { Db::name('order_action')->insert($order_action);
//TODO: 金額改為後台設定 } catch (\Exception $e) {
$money = [400, 50, 30, 20]; throw new \Exception($e->getMessage());
}
//寫入affiliate_log
$affiliate_log = [
'user_id' => Db::name('users')->where('sso_user_id', $value)->value('user_id'), $result = [
'order_id' => $order['order_id'], 'code' => $code,
'time' => time(), 'paycode' => 'eccredit',
'user_name' => Db::name('users')->where('sso_user_id', $value)->value('real_name'), 'msg' => $message,
'money' => $money[$key], 'order_sn' => $order_sn,
]; ];
Db::name('affiliate_log')->insert($affiliate_log);
//增加介紹人的獎金 $query_string = http_build_query($result);
Db::name('users')->where('sso_user_id', $value)->inc('frozen_money', $money[$key])->update(); return redirect(getUrl() . '/m/cartFinish/?' . $query_string);
} }
} catch (\Exception $e) { }
$code = 200;
$result['msg'] .= ',分潤失敗';
}
}
return '1|OK';
}
public function cancel()
{
Log::write('金流取消');
echo "金流取消";
}
public function otpError(){
$data = input();
$order_sn = $data['order_sn'];
$order = Db::name('order_info')
->where('order_sn', $order_sn)
->find();
$result['pay_status'] = '3';
$code = 500;
$message = 'OTP驗證失敗';
try {
//更新訂單狀態
Db::name('order_info')
->where('order_sn', $order_sn)
->update($result);
//更新訂單操縱紀錄
$order_action = [
'order_id' => $order['order_id'],
'action_user' => '綠界科技',
'order_status' => $order['order_status'],
'shipping_status' => $order['shipping_status'],
'pay_status' => $order['pay_status'],
'action_note' => '綠界金流: 信用卡支付,' . $message,
'log_time' => time(),
];
Db::name('order_action')->insert($order_action);
} catch (\Exception $e) {
throw new \Exception($e->getMessage());
}
$result = [
'code' => $code,
'paycode' => 'eccredit',
'msg' => $message,
'order_sn' => $order_sn,
];
$query_string = http_build_query($result);
return redirect(getUrl() . '/m/cartFinish/?' . $query_string);
}
private function getAffiliate($sso_user_id, $level = 1)
{
$parents = [];
$parent_id = Db::name('users')->where('sso_user_id', $sso_user_id)->value('parent_id');
if ($parent_id) {
$parents[$level] = $parent_id;
$level++;
$return = $this->getAffiliate($parent_id, $level);
$parents = array_merge($parents, $return);
}
return $parents;
}
}

@ -172,29 +172,12 @@ class Shipping extends ApiController
->where('order_sn', $result['order_sn']) ->where('order_sn', $result['order_sn'])
->find(); ->find();
//分潤獎金計算
//取得介紹人user_id
//分銷金額
try { try {
//找出第一二三四層介紹人 //計算分潤
$sso_user_id = Db::name('users')->where('user_id', $order['user_id'])->value('sso_user_id'); $res = \app\common\Affiliate::calculateProfitShare($order);
$parents = $this->getAffiliate($sso_user_id, 1);
if($res['code'] == 0){
foreach ($parents as $key => $value) { $result['msg'] .= ',分潤成功';
//TODO: 金額改為後台設定
$money = [400, 50, 30, 20];
//寫入affiliate_log
$affiliate_log = [
'user_id' => Db::name('users')->where('sso_user_id', $value)->value('user_id'),
'order_id' => $order['order_id'],
'time' => time(),
'user_name' => Db::name('users')->where('sso_user_id', $value)->value('real_name'),
'money' => $money[$key],
];
Db::name('affiliate_log')->insert($affiliate_log);
//增加介紹人的獎金
Db::name('users')->where('sso_user_id', $value)->inc('frozen_money', $money[$key])->update();
} }
//將會員的is_validated欄位改為1 //將會員的is_validated欄位改為1
@ -213,19 +196,4 @@ class Shipping extends ApiController
} }
} }
private function getAffiliate($sso_user_id, $level = 1)
{
$parents = [];
$parent_id = Db::name('users')->where('sso_user_id', $sso_user_id)->value('parent_id');
if ($parent_id) {
$parents[$level] = $parent_id;
$level++;
$return = $this->getAffiliate($parent_id, $level);
$parents = array_merge($parents, $return);
}
return $parents;
}
} }

@ -4,46 +4,16 @@ namespace app\appapi\controller\v1;
use app\appapi\ApiController; use app\appapi\ApiController;
use think\facade\Db; use think\facade\Db;
use app\common\sms\Sms;
class Test extends ApiController class Test extends ApiController
{ {
public function test(){ public function test(){
Sms::createSms('smsking', $order = Db::name('order_info')
['recipient'=>'0983214434','message'=>'簡訊測試'] ->where('order_id', 1071)
); ->find();
}
$res = \app\common\Affiliate::calculateProfitShare($order);
private function countLevelMembers($users,$deep=1){ // print_r($order);
$level = array(); return json_encode($res);
}
if($deep>3){
return 0;
}
if(!is_array($users)){
$users = [$users];
}
$userDo = Db::name('users')
->whereIn('parent_id',$users);
$level_num=$userDo->count();
if($level_num>0){
$level[$deep] = $level_num;
}
if($level_num > 0){
$user_list = $userDo->column('sso_user_id');
$rtn = $this->countLevelMembers($user_list,$deep+1);
if($rtn){
$level = $level + $rtn;
}
}
return $level;
}
} }

@ -14,9 +14,8 @@ class User extends ApiController
{ {
$data = input(); $data = input();
$user = Db::name('users') $user = Db::name('users')
->field('user_id,sso_user_id,headimg,user_money,frozen_money,reg_time,mobile_phone,real_name,refer_code,parent_id,is_validated') ->field('user_id,sso_user_id,headimg,user_money,frozen_money,reg_time,mobile_phone,email,real_name,refer_code,parent_id,is_validated,is_slash,is_resale')
->where('sso_user_id', $this->uid) ->where('sso_user_id', $this->uid)
->find(); ->find();
@ -72,6 +71,17 @@ class User extends ApiController
return $this->Success($user); return $this->Success($user);
} }
public function updateUserInfo()
{
$data = input('post.');
$user = Db::name('users')
->where('sso_user_id', $this->uid)
->update($data);
return $this->Success('更新成功');
}
public function getBank(){ public function getBank(){
//取得用戶銀行資料 //取得用戶銀行資料
$bank = Db::name('user_bank') $bank = Db::name('user_bank')
@ -514,6 +524,15 @@ class User extends ApiController
} }
public function updateUserResale()
{
$user = Db::name('users')
->where('sso_user_id', $this->uid)
->update(['is_resale' => 1]);
return $this->Success('申請成功');
}
public function getRecommandList(){ public function getRecommandList(){
$page = input('page') ? intval(input('page')) : 0; $page = input('page') ? intval(input('page')) : 0;
@ -526,7 +545,7 @@ class User extends ApiController
->toArray(); ->toArray();
foreach($users as $key=>$val){ foreach($users as $key=>$val){
$users[$key]['is_validated'] = $val['is_validated'] == 1 ? '訂單完成' : '未完成'; $users[$key]['is_slash'] = $val['is_slash'] == 1 ? '訂單完成' : '未完成';
//real_name 只顯示頭尾,中間加* //real_name 只顯示頭尾,中間加*
$users[$key]['real_name'] = mb_substr($val['real_name'],0,1,'utf-8') . str_repeat('*',mb_strlen($val['real_name'],'utf-8')-2) . mb_substr($val['real_name'],-1,1,'utf-8'); $users[$key]['real_name'] = mb_substr($val['real_name'],0,1,'utf-8') . str_repeat('*',mb_strlen($val['real_name'],'utf-8')-2) . mb_substr($val['real_name'],-1,1,'utf-8');
} }

@ -0,0 +1,65 @@
<?php
namespace app\common;
use think\facade\Db;
class Affiliate{
public static function calculateProfitShare($order){
$affiliate = json_decode(getConfigValue('affiliate'),true);
//是否開啟分銷
if(!$affiliate['on']){
return ['code'=>-1,'msg'=>'未開啟分銷'];
}
//檢查是否已經計算過
$is_calculate = Db::name('affiliate_log')->where('order_id', $order['order_id'])->count();
if($is_calculate){
return ['code'=>-1,'msg'=>'已經計算過'];
}
try {
//找出第一二三四層介紹人
$sso_user_id = Db::name('users')->where('user_id', $order['user_id'])->value('sso_user_id');
$parents = self::getAffiliate($sso_user_id, 1);
foreach ($parents as $key => $value) {
//計算分銷金額
$money[$key] = $order['order_amount'] * $affiliate['item'][$key]['level_money'] / 100;
//寫入affiliate_log
$affiliate_log = [
'user_id' => Db::name('users')->where('sso_user_id', $value)->value('user_id'),
'order_id' => $order['order_id'],
'time' => time(),
'user_name' => Db::name('users')->where('sso_user_id', $value)->value('real_name'),
'money' => $money[$key],
];
Db::name('affiliate_log')->insert($affiliate_log);
//增加介紹人的獎金
Db::name('users')->where('sso_user_id', $value)->inc('frozen_money', $money[$key])->update();
}
return true;
} catch (\Exception $e) {
print_r($e->getMessage());
return false;
}
}
private static function getAffiliate($sso_user_id, $level = 1)
{
$parents = [];
$parent_id = Db::name('users')->where('sso_user_id', $sso_user_id)->value('parent_id');
if ($parent_id) {
$parents[$level] = $parent_id;
$level++;
$return = self::getAffiliate($parent_id, $level);
$parents = array_merge($parents, $return);
}
return $parents;
}
}

@ -43,7 +43,7 @@ $modules['04_order']['02_order_list'] = 'order.html';
$modules['04_order']['05_edit_order_print'] = 'order.php?act=templates'; $modules['04_order']['05_edit_order_print'] = 'order.php?act=templates';
$modules['04_order']['06_undispose_booking'] = 'goods_booking.php?act=list_all'; $modules['04_order']['06_undispose_booking'] = 'goods_booking.php?act=list_all';
//$modules['04_order']['07_repay_application'] = 'repay.php?act=list_all'; //$modules['04_order']['07_repay_application'] = 'repay.php?act=list_all';
$modules['04_order']['08_add_order'] = 'order.php?act=add'; $modules['04_order']['08_add_order'] = 'order.html#/add';
$modules['04_order']['09_delivery_order'] = 'order.php?act=delivery_list'; $modules['04_order']['09_delivery_order'] = 'order.php?act=delivery_list';
//$modules['04_order']['10_back_order'] = 'order.php?act=back_list';//模板之家代码修改 退换货 //$modules['04_order']['10_back_order'] = 'order.php?act=back_list';//模板之家代码修改 退换货
$modules['04_order']['10_back_order'] = 'back.php?act=back_list'; //模板之家代码修改 退换货 $modules['04_order']['10_back_order'] = 'back.php?act=back_list'; //模板之家代码修改 退换货

Loading…
Cancel
Save