"子级用户消费分佣", "partner_calc"=>"子级合伙人收益分佣", ]; public function __construct($enterpriseId){ $this->enterpriseId = $enterpriseId; $this->cache = Factory::cache('systask'); //用户表 $this->dbCustomer = new DCustomer('default'); $customerTableName = $this->dbCustomer->getTableName($this->dbCustomer->get_Table(), $this->enterpriseId, $this->cutTable); $this->dbCustomer->setTable($customerTableName); //订单索引表 $this->dbOrderIndex = new DOrderIndex(); $this->dbOrderIndex->setTable('qianniao_order_index_' . $this->enterpriseId); //新分销合伙人表 $this->dbNewCommissionPartner = new DNewCommissionPartner('default'); $newCommissionPartnerTableName = $this->dbNewCommissionPartner->getTableName($this->dbNewCommissionPartner->get_Table(), $this->enterpriseId, $this->cutTable); $this->dbNewCommissionPartner->setTable($newCommissionPartnerTableName); //新分销佣金明细表 $this->dbNewCommissionDetail = new DNewCommissionDetail('default'); $newCommissionDetailTableName = $this->dbNewCommissionDetail->getTableName($this->dbNewCommissionDetail->get_Table(), $this->enterpriseId, $this->cutTable); $this->dbNewCommissionDetail->setTable($newCommissionDetailTableName); //新分销合伙人提现表 $this->dbNewCommissionCash = new DNewCommissionCash('default'); $newCommissionCashTableName = $this->dbNewCommissionCash->getTableName($this->dbNewCommissionCash->get_Table(), $this->enterpriseId, $this->cutTable); $this->dbNewCommissionCash->setTable($newCommissionCashTableName); //新分销合伙人余额明细表 $this->dbNewCommissionBalanceDetail = new DNewCommissionBalanceDetail('default'); $newCommissionBalanceDetailTableName = $this->dbNewCommissionBalanceDetail->getTableName($this->dbNewCommissionBalanceDetail->get_Table(), $this->enterpriseId, $this->cutTable); $this->dbNewCommissionBalanceDetail->setTable($newCommissionBalanceDetailTableName); //新分销合伙人分佣任务表 $this->dbNewCommissionTask = new DNewCommissionTask('default'); $newCommissionTaskTableName = $this->dbNewCommissionTask->getTableName($this->dbNewCommissionTask->get_Table(), $this->enterpriseId, $this->cutTable); $this->dbNewCommissionTask->setTable($newCommissionTaskTableName); } public function cacheTest(){ $key = "partnertaskcache".'::'.$this->enterpriseId; $result = $this->cache->get($key); if(!empty($result)){ return "重复操作"; } $this->cache->set($key,1,10); return "开始执行操作"; } /** * 添加任务 * @param type $orderId * @param type $enterpriseId * @return bool */ public static function addTask($orderId,$enterpriseId){ try{ if(empty($orderId) || empty($enterpriseId)){ return ["code"=>-1,"msg"=>"参数为空"]; } $dbTask = new DNewCommissionTask('default'); $taskTableName = $dbTask->getTableName($dbTask->get_Table(), $enterpriseId, 1); $dbTask->setTable($taskTableName); $count = $dbTask->count(["orderId"=>$orderId]); if($count>0){ return ["code"=>-1,"msg"=>"任务订单已存在"]; } $r = $dbTask->insert([ "orderId"=>$orderId, "enterpriseId"=>$enterpriseId, "title"=>"订单完成计算分佣", "mono"=>"", "status"=>0, "run_time"=>0, "time"=>time(), ]); return ["code"=>1,"msg"=>"任务已插入[{$r}]"]; } catch (\Exception $e){ return ["code"=>-1,"msg"=>"系统错误"]; } } public function runTask(){ $key = "partnertaskcache".'::'.$this->enterpriseId; $result = $this->cache->get($key); if(!empty($result)){ return ["code"=>-1,"msg"=>"操作频繁"]; } $this->cache->set($key,1,10); $dbTask = new DNewCommissionTask('default'); $taskTableName = $dbTask->getTableName($dbTask->get_Table(), $this->enterpriseId, 1); $dbTask->setTable($taskTableName); $data = $dbTask->select(["status"=>0],"*","id asc"); if(empty($data)){ return ["code"=>-1,"msg"=>"没有可执行任务"]; } $nowTime=time(); foreach($data as $k=>$v){ $res = $this->runCalcMoneyData($v["orderId"]); $save=[]; $save=["status"=>1,"mono"=>"执行成功","run_time"=>$nowTime]; if(empty($res) || $res["code"]==-1){ $save["mono"] = empty($res["msg"])?"系统错误执行失败":$res["msg"]; $save["status"] = -1; } $dbTask->update($save, ["id"=>$v["id"]]); } $this->cache->set($key,null); return ["code"=>1,"msg"=>"执行结束"]; } public function getCustomerDataByUserCenterId($userCenterId){ if(empty($userCenterId)){ return false; } $data = $this->dbCustomer->get(["userCenterId"=>$userCenterId]); if(empty($data)){ return false; } return $data; } public function setPushCustomerByUserCenterId($parentId=0,$childId=0){ //子级用户信息 $childData = $this->dbCustomer->get(["userCenterId"=>$childId]); if (empty($childData) || $childData["parentId"]>0 || $childData["isPartner"]==1 || $childData["isParentHead"]==1) { return ["code"=>-1,"msg"=>"用户不能被绑定","data"=>$childData]; } //父级用户信息 $parentData = $this->dbCustomer->get(["userCenterId"=>$parentId]); if(empty($parentData)){ return ["code"=>-1,"msg"=>"父级用户不存在","data"=>null]; } var_dump($childData["id"]); var_dump($parentData["id"]); return false; return $this->setPushCustomer($parentData["id"],$childData["id"]); } /** * 设置推广用户 * @param type $parentId * @param type $childId * @return bool */ public function setPushCustomer($parentId=0,$childId=0){ if($parentId == 0 || $childId == 0 || $parentId == $childId){ return ["code"=>-1,"msg"=>"参数错误","data"=>null]; } //子级用户信息 $childData = $this->dbCustomer->get($childId); if (empty($childData) || $childData["parentId"]>0 || $childData["isPartner"]==1 || $childData["isParentHead"]==1) { return ["code"=>-1,"msg"=>"用户不能被绑定","data"=>$childData]; } //父级用户信息 $parentData = $this->dbCustomer->get($parentId); if(empty($parentData)){ return ["code"=>-1,"msg"=>"父级用户不存在","data"=>null]; } $beginStatus = $this->dbCustomer->beginTransaction(); //保存父级数据 if($parentData["isParentHead"] == 0){ $parentSave=["isParentHead"=>1]; $pres = $this->dbCustomer->update($parentSave, ["id"=>$parentId]); if(empty($pres)){ $this->dbCustomer->rollBack(); return ["code"=>-1,"msg"=>"父级数据保存失败01","data"=>$parentSave]; } } //保存子级数据 $parentPath = empty($parentData["parentPath"]) ? $parentId : $parentData["parentPath"] . "," . $parentId; $childSave=["parentId"=>$parentId,"parentPath"=>$parentPath]; $res = $this->dbCustomer->update($childSave, ["id"=>$childId]); if(empty($res)){ $this->dbCustomer->rollBack(); return ["code"=>-1,"msg"=>"绑定失败","data"=>$childSave]; }else{ $beginStatus && $this->dbCustomer->commit(); // $this->delCustomerCache(); return ["code"=>1,"msg"=>"绑定成功","data"=>null]; } } /** * 设置用户为合伙人 * @param type $customerId */ public function setPartner($customerId){ $userData = $this->dbCustomer->get($customerId); if (empty($userData)) { return false; } if($userData["isPartner"]==1){ return true; } $save=["isPartner"=>1]; $res = $this->dbCustomer->update($save,["id"=>$customerId]); if(empty($res)){ return false; }else{ $this->getPartnerData($userData["id"], $userData["userCenterId"]); return true; } } /** * 获取用户父级合伙人 * @param type $customerId * @return bool */ public function getParentPartner($userData){ if (empty($userData) || empty($userData["parentPath"])) { return false; } //逆序祖先,从最近的祖先先查 $pathData = array_reverse(explode(",", trim($userData["parentPath"]))); $where=[]; $where[]=["isPartner","=",1]; $where[]=["id","in",$pathData]; $parentData = $this->dbCustomer->select($where); if(empty($parentData)){ return false; } $parentPartner = null; for($i=0;$i$v){ if($pathData[$i]==$v["id"]){ $itemData = $v; break; } } if(!empty($itemData) && $itemData["isPartner"]==1){ $parentPartner = $itemData; break; } } if(empty($parentPartner)){ return false; } return $parentPartner; } /** * 佣金计算 * @param type $customerId * @param type $money * @param type $type 1表示子级消费,2表示合伙人收益 * @return bool */ public function calcMoney($customerData,$money){ $parentData = $this->getParentPartner($customerData); if(empty($parentData) || $parentData["isPartner"]==0){ //上级合伙人不存在 if($money>=$this->levMoney && $customerData["isPartner"]==0){ $this->setPartner($customerData["id"]); } return false; } $per = $this->incomePer; $isUpgrade = 0; if($money>=$this->levMoney && $customerData["isPartner"]==0){ $per = $this->levPer; $isUpgrade = 1; } $resData=[ "childId"=>$customerData["id"], "childData"=>$customerData, "parentId"=>$parentData["id"], "parentData"=>$parentData, "per"=>$per, "money"=>$money, "commission"=>bcmul($money,$per,2), "isUpgrade"=>$isUpgrade ]; return $resData; } /** * 订单消费计算佣金 * @param type $orderCustomerId * @param type $orderMoney * @param type $isPart 订单用户如果是合伙人是否计算 * @return bool */ public function runCalcMoneyData($orderId){ //获取订单信息 if(empty($orderId)){ return ["code"=>-1,"msg"=>"订单id错误"]; } $orderIndexData = $this->dbOrderIndex->get(['id'=>$orderId]); if(empty($orderIndexData)){ return ["code"=>-1,"msg"=>"订单索引数据不存在"]; } // 切换订单分表,查询订单主单据数据 $dbOrder = new DOrder('default'); $fix = ceil($orderIndexData['userCenterId'] / 200000); $dbOrder->setTable('qianniao_order_' . $this->enterpriseId . '_' . $fix); $orderData = $dbOrder->get(['id' => $orderId]); if(empty($orderData)){ return ["code"=>-1,"msg"=>"订单数据不存在"]; } //开始计算 $isPart=false;//订单用户如果是合伙人是否计算 $orderCustomerId = $orderData["customerId"]; $orderMoney = $orderData["payAmount"]; //只计算小程序已完成订单 if(empty($orderCustomerId) || empty($orderMoney) || $orderData["payType"]!=1 || $orderData["source"]!=3 || $orderData["orderStatus"]!=5){ return ["code"=>-1,"msg"=>"只计算小程序微信支付已完成订单"]; } $customerData = $this->dbCustomer->get($orderCustomerId); if (empty($customerData)) { return ["code"=>-1,"msg"=>"用户不存在"]; } if(empty($customerData["parentPath"])){ if($orderMoney>=$this->levMoney && $customerData["isPartner"]==0){ $this->setPartner($orderCustomerId); } return ["code"=>-1,"msg"=>"用户不存在父级"]; } //订单用户如果是合伙人消费则不计算收益 if(!$isPart && $customerData["isPartner"]==1){ return ["code"=>-1,"msg"=>"合伙人消费不计算上级收益"]; } $data=[]; $nowTime = time(); //计算低层收益 $bottomData = $this->calcMoney($customerData,$orderMoney); if(empty($bottomData)){ return ["code"=>-1,"msg"=>"上级合伙人不存在"]; } //合伙人账户 $bottomPartnerData = $this->getPartnerData($bottomData["parentData"]["id"], $bottomData["parentData"]["userCenterId"]); if(empty($bottomPartnerData)){ return ["code"=>-1,"msg"=>"上级合伙人账户错误"]; } //记录底层收益 $data[]=[ "orderMoney"=>$orderMoney,//订单支付金额 "calcMoney"=>$bottomData["money"],//佣金计算金额 "sourceCustomerId"=>$bottomData["childId"],//来源客户id "partnerId"=>$bottomPartnerData["id"],//收钱合伙人账号id "customerId"=>$bottomPartnerData["customerId"],//收钱合伙人 "userCenterId"=>$bottomPartnerData["userCenterId"],//收钱合伙人 "commission"=>$bottomData["commission"],//佣金金额 "per"=>$bottomData["per"],//佣金比例 "type"=>0, "orderId"=>$orderData["id"], "status"=>0,//暂时不需要 "title"=>"子级用户消费分佣", "isUpgrade"=>$bottomData["isUpgrade"], "mono"=>"", "time"=>$nowTime, ]; //计算顶层收益 $topData = $this->calcMoney($bottomData["parentData"],$bottomData["commission"]); if(!empty($topData)){ $topPartnerData = $this->getPartnerData($topData["parentData"]["id"], $topData["parentData"]["userCenterId"]); if(empty($topPartnerData)){ return ["code"=>-1,"msg"=>"顶级合伙人账户错误"]; } //记录顶层收益 $data[]=[ "orderMoney"=>$orderMoney,//订单支付金额 "calcMoney"=>$topData["money"],//佣金计算金额 "sourceCustomerId"=>$topData["childId"],//来源客户id "partnerId"=>$topPartnerData["id"],//收钱合伙人账号id "customerId"=>$topPartnerData["customerId"],//收钱合伙人 "userCenterId"=>$topPartnerData["userCenterId"],//收钱合伙人 "commission"=>$topData["commission"],//佣金金额 "per"=>$topData["per"],//佣金比例 "type"=>1,//1表示子级合伙人收益计算收益,0表示子级消费计算收益 "orderId"=>$orderData["id"], "status"=>0, "title"=>"子级合伙人收益分佣", "isUpgrade"=>$topData["isUpgrade"], "mono"=>"", "time"=>$nowTime, ]; } $num=0; //开启事务 $this->dbNewCommissionDetail->beginTransaction(); $lms = ""; foreach($data as $k=>$v){ $count = $this->dbNewCommissionDetail->count(["orderId"=>$v["orderId"],"partnerId"=>$v["partnerId"]]); if($count>0){ $lms.="当前订单已计算佣金[{$v['orderId']}];"; continue; } $nid = $this->dbNewCommissionDetail->insert($v); if(empty($nid)){ $lms.="佣金明细插入失败[{$v['orderId']}];"; continue; } //查询合伙人账户 $partnerItem = $this->dbNewCommissionPartner->get(["id"=>$v["partnerId"]]); if(empty($partnerItem)){ $num = 0; $lms.="合伙人账户不存在[{$v['orderId']}];"; break; } $update = [ 'balance' => bcadd($partnerItem['balance'], $v["commission"], 2), 'totalMoney' => bcadd($partnerItem['totalMoney'], $v["commission"], 2), 'updateTime' => $nowTime, ]; //添加账户余额明细记录 $dres = $this->dbNewCommissionBalanceDetail->insert([ "type"=>1, "title"=>$v["title"], "code"=>$v["type"]==1 ? "partner_calc" : "order_calc", "money"=>$v["commission"], "content"=>$v["title"], "admin_id"=>0, "customer_id"=>$v["customerId"], "partner_id"=>$v["partnerId"], "user_center_id"=>$v["userCenterId"], "cash_id"=>0, "old_balance"=>$partnerItem["balance"], "now_balance"=>$update["balance"], "time"=>$nowTime, "expand"=>"", "detail_id"=>$nid, ]); if(empty($dres)){ $num = 0; $lms.="账户余额明细插入失败[{$v['orderId']}];"; break; } //更新账户余额 $upRes = $this->dbNewCommissionPartner->update($update, ['id' => $v["partnerId"]]); if(empty($upRes)){ $num = 0; $lms.="更新账户余额失败[{$v['orderId']}];"; break; } $num++; } if($num<=0){ $this->dbNewCommissionDetail->rollBack(); return ["code"=>-1,"msg"=>"数据更新失败:".$lms]; } $this->dbNewCommissionDetail->commit(); //佣金更新完后验证设置合伙人 if($bottomData["isUpgrade"]==1){ $this->setPartner($bottomData["childId"]); } return ["code"=>1,"msg"=>"执行成功".$lms]; } public function getPartnerData($customerId,$userCenterId){ if(empty($customerId)){ return false; } $partnerData = $this->dbNewCommissionPartner->get(["customerId"=>$customerId]); if(empty($partnerData)){ $nowTime = time(); $partnerData=[ "userCenterId"=>$userCenterId, "customerId"=>$customerId, "balance"=>0, "waitMoney"=>0, "withdraw"=>0, "totalMoney"=>0, "deleteStatus"=>5, "createTime"=>$nowTime, "updateTime"=>$nowTime, "expand"=>"", ]; $partnerId = $this->dbNewCommissionPartner->insert($partnerData); if(empty($partnerId)){ return false; } $partnerData["id"] = $partnerId; } return $partnerData; } /** * 获取分佣明细 */ public function getCommissionDetail($customerId,$parms){ $where=[]; if(!empty($customerId)){ $where["customerId"] = $customerId; } $data = $this->dbNewCommissionDetail->select(["customerId"=>$customerId], "*", "id desc", $parms["limit"], $parms["offset"]); $total = $this->dbNewCommissionDetail->count($where); if(empty($data)){ $data = []; } $return = [ 'data' => $data, 'total' => (isset($total)&&!empty($total)) ? intval($total) : 0, ]; return $return; } /** * 获取合伙人账户余额明细 */ public function getCommissionBalanceDetail($customerId,$parms){ $where=[]; if(!empty($customerId)){ $where["customerId"] = $customerId; } $data = $this->dbNewCommissionBalanceDetail->select(["customerId"=>$customerId], "*", "id desc", $parms["limit"], $parms["offset"]); $total = $this->dbNewCommissionBalanceDetail->count($where); if(empty($data)){ $data = []; } $return = [ 'data' => $data, 'total' => (isset($total)&&!empty($total)) ? intval($total) : 0, ]; return $return; } /** * 提现申请 */ public function applyCash($data){ } /** * 删除用户缓存 * @param type $customerId * @param type $userCenterId */ public function delCustomerCache($customerId,$userCenterId){ $objCustomerCache = new CustomerCache(); $objCustomerCache->delCustomerData($this->enterpriseId, $customerId); $objCustomerCache->delCustomerUserData($this->enterpriseId, $userCenterId); } }