123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483 |
- <?php
- /**
- * @copyright Copyright (c) 2017 https://www.sapixx.com All rights reserved.
- * @license Licensed (http://www.apache.org/licenses/LICENSE-2.0).
- * @author pillar<ltmn@qq.com>
- * 订单逻辑
- */
- namespace app\allwin\widget;
- use app\allwin\widget\Inform;
- use app\allwin\model\CouponUser; //用户优惠券
- use app\allwin\model\CouponSubsidize; //平台补贴优惠券
- use app\allwin\model\Fund; //基金
- use app\allwin\model\MchIdQueen; //队列
- use app\allwin\model\MchId; //商户号
- use app\allwin\model\Bank;
- use app\allwin\model\AllwinStore;
- use app\allwin\model\BankBill;
- use app\allwin\model\StoreBill;
- use app\allwin\model\FundBill;
- class Order{
- /**
- * 微信买单收益分账
- * @param array $order 订单信息
- * @return void
- */
- public static function income(array $order){
- $store = AllwinStore::where(['id' => $order['store_id']])->field('id,member_miniapp_id,charges,manage_uid,mch_id,name')->find();
- if(empty($store)){
- return;
- }
- //判断当前会员是否买单好店的用户体系,是当前好店的不分润
- $setting = model('AllwinConfig')->getConfig($store->member_miniapp_id);
- $is_profitsharing = false;
- if($setting->is_fees_types <= 1){
- if($setting->is_fees_types == 0){
- $is_profitsharing = true;
- }else{
- if($order['coupon_user_id']){
- $is_profitsharing = true;
- }
- }
- }
- $default_charges = $setting->default_charges/1000; //默认手续费
- $charges = $default_charges; //好店服务费
- $user_store_id = 0; //下单用户来自商家
- $user_store_manage_uid = 0; //下单用户来自商家的管理员ID(用于奖励推荐开通会员的商家UID)
- $is_charges = false; //是否分润
- //判断是否这个店的会员
- if($store->charges > 0 && $is_profitsharing){
- $allwinUser = model('AllwinUser')->getUserStoreId($order['uid']);
- $user_store_id = empty($allwinUser) ? 0 : $allwinUser->store_id;
- if($user_store_id != $store->id){
- $user_store_manage_uid = empty($allwinUser->store) ? 0 : $allwinUser->store->manage_uid; //好店老板UID
- $charges = $store->charges/1000; //商家基础服务费
- $is_charges = true; //分润
- }
- }
- /**
- * 计算金额
- * $order['store_amount'] 好店应收金额
- * $order['order_amount'] 实际支付金额
- */
- $wechat_charges_amout = money(abs($order['order_amount']*$default_charges)); //微信扣除的服务费(厘四舍五入到分)
- $income = 0;
- if($is_charges == true){
- $service_amount = money($order['store_amount']*$charges);
- $income = money($service_amount-$wechat_charges_amout-0.01); //分账的本金(不包含微信手续费,减去1分保证分账金额)
- $store_amount = money($order['store_amount']-$service_amount); //老板收入
- }else{
- $store_amount = money($order['store_amount']-$wechat_charges_amout); //老板收入
- }
- if ($store_amount < 0){
- return; //金额小于0 不结算
- }
- $queen = []; //分账队列参数
- if ($setting->is_psp == 0 || empty($store->mch_id)) {
- Bank::dueMoney($store->member_miniapp_id,$store->manage_uid,$store_amount);
- $msg = '结算到平台';
- }else{
- $msg = '结算到商户号';
- }
- if ($setting->is_wechat_profitsharing && $is_profitsharing){
- if($store->mch_id == 0){
- $mch = MchId::getMch(0,$store->member_miniapp_id);
- $store->mch_id = $mch->id;
- }
- $queen[] = [
- 'member_miniapp_id' => $store->member_miniapp_id,
- 'store_id' => $store->id,
- 'uid' => 0,
- 'mch_id' => $store->mch_id,
- 'amount' => $store_amount*100,
- 'transaction_id' => $order['paid_no'],
- 'out_order_no' => $order['order_no'],
- 'is_finish' => 0,
- 'types' => 1,
- 'msg' => $msg,
- ];
- }
- StoreBill::add(['miniapp_id' => $store->member_miniapp_id,'uid' => $store->manage_uid,'store_id' => $store->id,'pay_uid' => $order['uid'],'money' => $store_amount],$msg); //商家账单
- BankBill::add(['miniapp_id' => $store->member_miniapp_id,'uid' => $store->manage_uid,'store_id' => $store->id,'pay_uid' => $order['uid'],'money' => $store_amount],$msg); //个人账单
- model('StoreStats')->payment($store,$store_amount); //增加统计
- //增加优惠券统计
- if($order['coupon_price'] > 0){
- model('StoreStats')->coupon($store,$order['coupon_price']);
- }
- //判断分账金额最小0.1元
- $nominate_money = 0;
- $agent_rebate = 0;
- $store_rebate = 0;
- $company_rebate = 0;
- $workers_rebate = 0;
- if($is_charges && $is_profitsharing && $income >= 0.1){
- //会员直推奖励
- $level = model('Levels')->where(['user_id' => $order['uid'],'level'=> 1])->find();
- if (!empty($level)) {
- $vip = model('Vip')->where(['user_id' => $level->parent_id,'is_lock' => 0,'state' => 1])->field('vipcard_id,user_id')->find();
- if(!empty($vip)){
- if($vip->vipcard->is_tax){
- $nominate_money = money($income*$vip->vipcard->nominate/100);
- if($nominate_money > 0.01){
- if($setting->is_wechat_profitsharing){
- $queen[] = [
- 'member_miniapp_id' => $store->member_miniapp_id,
- 'store_id' => $store->id,
- 'uid' => $level->parent_id,
- 'mch_id' => 0,
- 'amount' => $nominate_money*100,
- 'transaction_id' => $order['paid_no'],
- 'out_order_no' => $order['order_no'],
- 'is_finish' => 0,
- 'types' => 0,
- 'msg' => '['.$vip->vipcard->name.']推荐奖励',
- ];
- }else{
- Bank::dueMoney($store->member_miniapp_id,$level->parent_id,(float)$nominate_money);
- BankBill::add(['miniapp_id' => $store->member_miniapp_id,'store_id' => $store->id,'money' => $nominate_money,'uid'=> $level->parent_id,'pay_uid' => $order['uid']],'['.$vip->vipcard->name.']消费奖励');
- }
- }
- }
- }
- }
- //社群主奖励
- if($setting->agent_rebate > 0){
- $agentuid = model('AllwinUserAgent')->agentUid($order['uid'],$store->member_miniapp_id);
- if($agentuid){
- $agent_rebate = money($income*$setting->agent_rebate/100);
- if ($agent_rebate > 0.01) {
- if($setting->is_wechat_profitsharing){
- $queen[] = [
- 'member_miniapp_id' => $store->member_miniapp_id,
- 'store_id' => $store->id,
- 'uid' => $agentuid,
- 'mch_id' => 0,
- 'amount' => $agent_rebate*100,
- 'transaction_id' => $order['paid_no'],
- 'out_order_no' => $order['order_no'],
- 'is_finish' => 0,
- 'types' => 0,
- 'msg' => '[社群主]消费奖励',
- ];
- }else{
- Bank::dueMoney($store->member_miniapp_id,$agentuid,(float)$agent_rebate);
- BankBill::add(['miniapp_id' => $store->member_miniapp_id,'store_id' => $store->id,'money' => $agent_rebate,'uid'=> $agentuid,'pay_uid' =>$order['uid']],'[社群主]消费奖励');
- }
- }
- }
- }
- //判断分成用户所属商家ID
- if($user_store_manage_uid > 0){
- $store_rebate = money($income*$setting->store_rebate/100);
- if ($store_rebate > 0.01) {
- if($setting->is_wechat_profitsharing){
- $queen[] = [
- 'member_miniapp_id' => $store->member_miniapp_id,
- 'store_id' => $store->id,
- 'uid' => $user_store_manage_uid,
- 'mch_id' => 0,
- 'amount' => $store_rebate*100,
- 'transaction_id' => $order['paid_no'],
- 'out_order_no' => $order['order_no'],
- 'is_finish' => 0,
- 'types' => 0,
- 'msg' => '[其它好店]买单奖励',
- ];
- }else{
- $store_rebate_bill = [
- 'miniapp_id' => $store->member_miniapp_id,
- 'uid' => $user_store_manage_uid,
- 'store_id' => $allwinUser->store_id,
- 'pay_uid' => $order['uid'],
- 'money' => $store_rebate
- ];
- Bank::dueMoney($store->member_miniapp_id,$user_store_manage_uid,(float)$store_rebate); //商家分润
- StoreBill::add($store_rebate_bill,'[其它好店]买单奖励'); //商家账单
- BankBill::add($store_rebate_bill,'[其它好店]买单奖励'); //个人账单
- }
- }
- }
- //给合伙人
- if($setting->workers_rebate > 0){
- $worker = model('Worker')->whereRaw("FIND_IN_SET({$store->id},store_ids)")->field('uid')->find();
- if(!empty($worker)){
- $workers_rebate = money($income*$setting->workers_rebate/100);
- if ($workers_rebate > 0.01) {
- if ($setting->is_wechat_profitsharing) {
- $queen[] = [
- 'member_miniapp_id' => $store->member_miniapp_id,
- 'store_id' => $store->id,
- 'uid' => $worker->uid,
- 'mch_id' => 0,
- 'amount' => $workers_rebate*100,
- 'transaction_id' => $order['paid_no'],
- 'out_order_no' => $order['order_no'],
- 'is_finish' => 0,
- 'types' => 0,
- 'msg' => '[合伙人]买单奖励',
- ];
- } else {
- Bank::dueMoney($store->member_miniapp_id,$worker->uid,(float)$workers_rebate);
- BankBill::add(['miniapp_id' => $store->member_miniapp_id,'store_id' => $store->id,'money' => $workers_rebate,'uid'=> $worker->uid,'pay_uid' =>$order['uid']], '[合伙人]买单奖励');
- }
- }
- }
- }
- //给归属公司分账
- if($store->city_id > 0){
- $city = model('City')->where(['id' => $store->city_id])->find();
- if (!empty($city)) {
- $company_rebate = money($income*$setting->company_rebate/100);
- if ($company_rebate > 0.01) {
- if ($setting->is_wechat_profitsharing) {
- //分账到商户号
- $queen[] = [
- 'member_miniapp_id' => $store->member_miniapp_id,
- 'city_id' => $store->city_id,
- 'store_id' => $store->id,
- 'uid' => 0,
- 'mch_id' => $city->mch_id,
- 'amount' => $company_rebate*100,
- 'transaction_id' => $order['paid_no'],
- 'out_order_no' => $order['order_no'],
- 'is_finish' => 0,
- 'types' => 1,
- 'msg' => '[城市]买单奖励',
- ];
- } else {
- $ompany_rebate_bill = [
- 'miniapp_id' => $store->member_miniapp_id,
- 'store_id' => $store->id,
- 'city_id' => $store->city_id,
- 'uid' => $city->uid,
- 'pay_uid' => $order['uid'],
- 'money' => $company_rebate
- ];
- Bank::dueMoney($store->member_miniapp_id,$city->uid,(float)$company_rebate); //商家分润
- BankBill::add($ompany_rebate_bill, '[城市]买单奖励'); //个人账单
- model('CityBill')->add($ompany_rebate_bill, '[城市]买单奖励'); //公司奖励
- }
- }
- }
- }
- //扣除运营费(给运营城市)
- $platform_money = money($income-($nominate_money+$agent_rebate+$store_rebate+$company_rebate+$workers_rebate));
- if($platform_money > 0.01){
- $mch = MchId::getMch(0,$store->member_miniapp_id);
- if (!empty($mch)) {
- if($setting->is_wechat_profitsharing){
- $queen[] = [
- 'member_miniapp_id' => $store->member_miniapp_id,
- 'store_id' => $store->id,
- 'uid' => 0,
- 'mch_id' => $mch->id,
- 'amount' => $platform_money*100,
- 'transaction_id' => $order['paid_no'],
- 'out_order_no' => $order['order_no'],
- 'is_finish' => 0,
- 'types' => 1,
- 'msg' => '[运营公司]服务费结余',
- ];
- }else{
- if(isset($mch->city->uid)){
- $platform_rebate_bill = [
- 'miniapp_id' => $store->member_miniapp_id,
- 'store_id' => $store->id,
- 'uid' => $mch->city->uid,
- 'pay_uid' => $order['uid'],
- 'money' => $platform_money
- ];
- Bank::dueMoney($store->member_miniapp_id,$mch->city->uid,(float)$platform_money); //商家分润
- BankBill::add($platform_rebate_bill,'[运营公司]买单服务费结余'); //个人账单
- model('CityBill')->add($platform_rebate_bill,'[运营公司]买单服务费结余'); //公司奖励
- }
- }
- }
- }
- }
- //平台优惠券
- $platform_amount = [];
- if(!empty($order['platform_amount']) && $is_profitsharing){
- $platform_amount = self::platform_amount($order,$store,$setting);
- if(!empty($platform_amount)){
- $queen = array_merge($queen,$platform_amount);
- }
- }
- //添加一个无需分账的队列
- if(empty($queen) && $setting->is_wechat_profitsharing && $is_profitsharing){
- $queen[] = [
- 'member_miniapp_id' => $store->member_miniapp_id,
- 'store_id' => $store->id,
- 'uid' => 0,
- 'mch_id' => 0,
- 'amount' => 0,
- 'transaction_id' => $order['paid_no'],
- 'out_order_no' => $order['order_no'],
- 'is_finish' => 0,
- 'types' => 2,
- 'msg' => '无需分账,金额¥'.$store_amount,
- ];
- }
- //增加队列
- if(!empty($queen)){
- MchIdQueen::createQueen($queen);
- }
- //订单公众号模板通知
- if(!empty($setting->tplmsg_order)){
- Inform::order(['uid' => $store->manage_uid,'store_id' => $store->id,'store_name' => $store->name,'amount' => $order['store_amount'],'order_no' => $order['order_no'],'miniapp_id' => $store->member_miniapp_id,'tplmsg' => $setting->tplmsg_order]);
- }
- return true;
- }
- /**
- * 优惠券分配
- * @param array $store [分配金额]
- * @param object $store [店铺信息]
- * @param object $setting [配置信息]
- * @return array
- */
- public static function platform_amount($order,$store,$setting){
- if(empty($order['platform_amount'])){
- return [];
- }
- $platform_amount = $order['platform_amount'];
- $city = model('City')->where(['id' => $store->city_id])->find();
- $queen = [];
- //分配优惠券利润给加盟城市
- $city_money = $platform_amount*$setting->city_rate/100;
- if($city_money >= 0.01){
- if(!empty($city)) {
- if ($setting->is_wechat_profitsharing) {
- $queen[] = [
- 'member_miniapp_id' => $store->member_miniapp_id,
- 'city_id' => $store->city_id,
- 'store_id' => $store->id,
- 'uid' => 0,
- 'mch_id' => $city->mch_id,
- 'amount' => $city_money*100,
- 'transaction_id' => $order['paid_no'],
- 'out_order_no' => $order['order_no'],
- 'is_finish' => 0,
- 'types' => 1,
- 'msg' => '[城市]优惠券分润',
- ];
- } else {
- $bill = [
- 'miniapp_id' => $store->member_miniapp_id,
- 'store_id' => $store->id,
- 'city_id' => $store->city_id,
- 'uid' => $city->uid,
- 'pay_uid' => $order['uid'],
- 'money' => $city_money
- ];
- Bank::dueMoney($store->member_miniapp_id,$city->uid,$city_money); //商家分润
- BankBill::add($bill,'[城市]优惠券分润'); //个人账单
- model('CityBill')->add($bill,'[城市]优惠券分润'); //公司奖励
- }
- }
- }
- //分配优惠券给平台方
- $admin_money = empty($city->is_default) ? $platform_amount*($setting->admin_rate/100) : $platform_amount*(1-$setting->city_rate/100);
- if($admin_money >= 0.01){
- if ($setting->is_wechat_profitsharing) {
- $mch = MchId::getMch();
- $queen[] = [
- 'member_miniapp_id' => $store->member_miniapp_id,
- 'city_id' => $store->city_id,
- 'store_id' => $store->id,
- 'uid' => 0,
- 'mch_id' => $mch->id,
- 'amount' => $admin_money*100,
- 'transaction_id' => $order['paid_no'],
- 'out_order_no' => $order['order_no'],
- 'is_finish' => 0,
- 'types' => 1,
- 'msg' => '[平台]优惠券分润',
- ];
- }else{
- Bank::dueMoney($store->member_miniapp_id,$setting->admin_uid,$admin_money); //商家分润
- BankBill::add(['uid' => $setting->admin_uid,'money' => $admin_money,'miniapp_id' => $store->member_miniapp_id,'store_id' => $store->id,'city_id' => $store->city_id,'pay_uid' => $order['uid']],'[城市]优惠券分润'); //个人账单
- }
- }
- //分配优惠券给运营公司
- if(empty($city->is_default)){
- $agent_money = $platform_amount*($setting->company_rate/100);
- if($agent_money >= 0.01){
- $agent_mch = MchId::getMch(0,$store->member_miniapp_id);
- if ($setting->is_wechat_profitsharing) {
- $queen[] = [
- 'member_miniapp_id' => $store->member_miniapp_id,
- 'city_id' => $store->city_id,
- 'store_id' => $store->id,
- 'uid' => 0,
- 'mch_id' => $agent_mch->id,
- 'amount' => $agent_money*100,
- 'transaction_id' => $order['paid_no'],
- 'out_order_no' => $order['order_no'],
- 'is_finish' => 0,
- 'types' => 1,
- 'msg' => '[运营公司]优惠券分润',
- ];
- } else {
- $agent_bill = [
- 'miniapp_id' => $store->member_miniapp_id,
- 'store_id' => $store->id,
- 'city_id' => $store->city_id,
- 'uid' => $agent_mch->city->uid,
- 'pay_uid' => $order['uid'],
- 'money' => $agent_money
- ];
- Bank::dueMoney($store->member_miniapp_id,$agent_mch->city->uid,$agent_money); //商家分润
- BankBill::add($agent_bill, '[运营公司]优惠券分润'); //个人账单
- model('CityBill')->add($agent_bill, '[运营公司]优惠券分润'); //公司奖励
- }
- }
- }
- return $queen;
- }
- /**
- * 采购基金商户补贴
- * @param array $order [计算参数]
- * @return boolean
- */
- public static function fund(array $order){
- if($order['coupon_user_id'] <= 0){
- return;
- }
- $condition['uid'] = $order['uid'];
- $condition['member_miniapp_id'] = $order['member_miniapp_id'];
- $condition['id'] = $order['coupon_user_id'];
- $rel = CouponUser::getuser($condition);
- if(empty($rel)){
- return;
- }
- $fund_coupon = CouponSubsidize::where(['coupon_id' => $rel->coupon_id])->find();
- if(empty($fund_coupon)){
- return;
- }
- if($fund_coupon->how_much <= 0){
- return;
- }
- $fund = new Fund();
- $subsidy = $fund->subsidy($order['member_miniapp_id'],$fund_coupon->how_much);
- if($subsidy && $rel->store->manage_uid > 0){
- Bank::dueMoney($order['member_miniapp_id'],$rel->store->manage_uid,(float)$subsidy); //结算利润
- model('StoreStats')->payment($order['member_miniapp_id'],$order['store_id'],$subsidy); //增加统计
- $bill = [
- 'miniapp_id' => $order['member_miniapp_id'],
- 'store_id' => $order['store_id'],
- 'pay_uid' => $order['uid'],
- 'money' => $subsidy,
- 'order_no' => $order['order_no'],
- 'uid' => $rel->store->manage_uid,
- 'types' => 1
- ];
- BankBill::add($bill,'消费补贴'); //个人账单
- StoreBill::add($bill,'消费补贴'); //商家账单
- FundBill::add($bill); //补贴出账
- }
- }
- }
|