PartnerTools.Class.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. <?php
  2. namespace Util\Common;
  3. use JinDouYun\Dao\Customer\DCustomer;
  4. use JinDouYun\Cache\CustomerCache;
  5. use JinDouYun\Dao\Order\DOrderIndex;
  6. use JinDouYun\Dao\Order\DOrder;
  7. use JinDouYun\Dao\CommissionPartner\DNewCommissionBalanceDetail;
  8. use JinDouYun\Dao\CommissionPartner\DNewCommissionCash;
  9. use JinDouYun\Dao\CommissionPartner\DNewCommissionDetail;
  10. use JinDouYun\Dao\CommissionPartner\DNewCommissionPartner;
  11. class PartnerTools{
  12. private $dbCustomer;
  13. private $dbNewCommissionPartner;
  14. private $dbNewCommissionDetail;
  15. private $dbNewCommissionCash;
  16. private $dbNewCommissionBalanceDetail;
  17. private $enterpriseId;
  18. private $cutTable = 1;//客户按照企业id分表
  19. private $errorMsg = "";
  20. public function __construct($enterpriseId){
  21. $this->enterpriseId = $enterpriseId;
  22. //用户表
  23. $this->dbCustomer = new DCustomer('default');
  24. $customerTableName = $this->dbCustomer->getTableName($this->dbCustomer->get_Table(), $this->enterpriseId, $this->cutTable);
  25. $this->dbCustomer->setTable($customerTableName);
  26. //新分销合伙人表
  27. $this->dbNewCommissionPartner = new DNewCommissionPartner('default');
  28. $newCommissionPartnerTableName = $this->dbNewCommissionPartner->getTableName($this->dbNewCommissionPartner->get_Table(), $this->enterpriseId, $this->cutTable);
  29. $this->dbNewCommissionPartner->setTable($newCommissionPartnerTableName);
  30. //新分销佣金明细表
  31. $this->dbNewCommissionDetail = new DNewCommissionDetail('default');
  32. $newCommissionDetailTableName = $this->dbNewCommissionDetail->getTableName($this->dbNewCommissionDetail->get_Table(), $this->enterpriseId, $this->cutTable);
  33. $this->dbNewCommissionDetail->setTable($newCommissionDetailTableName);
  34. //新分销合伙人提现表
  35. $this->dbNewCommissionCash = new DNewCommissionCash('default');
  36. $newCommissionCashTableName = $this->dbNewCommissionCash->getTableName($this->dbNewCommissionCash->get_Table(), $this->enterpriseId, $this->cutTable);
  37. $this->dbNewCommissionCash->setTable($newCommissionCashTableName);
  38. //新分销合伙人余额明细表
  39. $this->dbNewCommissionBalanceDetail = new DNewCommissionBalanceDetail('default');
  40. $newCommissionBalanceDetailTableName = $this->dbNewCommissionBalanceDetail->getTableName($this->dbNewCommissionBalanceDetail->get_Table(), $this->enterpriseId, $this->cutTable);
  41. $this->dbNewCommissionBalanceDetail->setTable($newCommissionBalanceDetailTableName);
  42. }
  43. /**
  44. * 设置推广用户
  45. * @param type $parentId
  46. * @param type $childId
  47. * @return bool
  48. */
  49. public function setPushCustomer($parentId=0,$childId=0){
  50. if($parentId == 0 || $childId == 0 || $parentId == $childId){
  51. return false;
  52. }
  53. //子级用户信息
  54. $childData = $this->dbCustomer->get($childId);
  55. if (empty($childData) || $childData["parentId"]>0 || $childData["isPartner"]==1 || $childData["isParentHead"]==1) {
  56. return false;
  57. }
  58. //父级用户信息
  59. $parentData = $this->dbCustomer->get($parentId);
  60. if(empty($parentData)){
  61. return false;
  62. }
  63. $beginStatus = $this->dbCustomer->beginTransaction();
  64. //保存父级数据
  65. if($parentData["isParentHead"] == 0){
  66. $parentSave=["isParentHead"=>1];
  67. $pres = $this->dbCustomer->update($parentSave, ["id"=>$parentId]);
  68. if(empty($pres)){
  69. $this->dbCustomer->rollBack();
  70. return false;
  71. }
  72. }
  73. //保存子级数据
  74. $parentPath = empty($parentData["parentPath"]) ? $parentId : $parentData["parentPath"] . "," . $parentId;
  75. $childSave=["parentId"=>$parentId,"parentPath"=>$parentPath];
  76. $res = $this->dbCustomer->update($childSave, ["id"=>$childId]);
  77. if(empty($res)){
  78. $this->dbCustomer->rollBack();
  79. return false;
  80. }else{
  81. $beginStatus && $this->dbCustomer->commit();
  82. // $this->delCustomerCache();
  83. return true;
  84. }
  85. }
  86. /**
  87. * 设置用户为合伙人
  88. * @param type $customerId
  89. */
  90. public function setPartner($customerId){
  91. $userData = $this->dbCustomer->get($customerId);
  92. if (empty($userData)) {
  93. return false;
  94. }
  95. if($userData["isPartner"]==1){
  96. return true;
  97. }
  98. $save=["isPartner"=>1];
  99. $res = $this->dbCustomer->update($save,["id"=>$customerId]);
  100. if(empty($res)){
  101. return false;
  102. }else{
  103. $this->getPartnerData($userData["id"], $userData["userCenterId"]);
  104. return true;
  105. }
  106. }
  107. /**
  108. * 获取用户父级合伙人
  109. * @param type $customerId
  110. * @return bool
  111. */
  112. public function getParentPartner($userData){
  113. if (empty($userData) || empty($userData["parentPath"])) {
  114. return false;
  115. }
  116. $where["isPartner"]=1;
  117. $where["id"]=["in",trim($userData["parentPath"])];
  118. $parentData = $this->dbCustomer->select($where);
  119. if(empty($parentData)){
  120. return false;
  121. }
  122. $parentPartner = null;
  123. //逆序祖先,从最近的祖先先查
  124. $pathData = array_reverse(explode(",", trim($userData["parentPath"])));
  125. for($i=0;$i<count($pathData);$i++){
  126. $itemData = [];
  127. foreach($parentData as $k=>$v){
  128. if($pathData[$i]==$v["id"]){
  129. $itemData = $v;
  130. break;
  131. }
  132. }
  133. if(!empty($itemData) && $itemData["isPartner"]==1){
  134. $parentPartner = $itemData;
  135. break;
  136. }
  137. }
  138. if(empty($parentPartner)){
  139. return false;
  140. }
  141. return $parentPartner;
  142. }
  143. /**
  144. * 佣金计算
  145. * @param type $customerId
  146. * @param type $money
  147. * @param type $type 1表示子级消费,2表示合伙人收益
  148. * @return bool
  149. */
  150. public function calcMoney($customerData,$money){
  151. $parentData = $this->getParentPartner($customerData);
  152. if(empty($parentData) || $parentData["isPartner"]==0){
  153. return false;
  154. }
  155. $per = 0.1;//佣金比例
  156. $isUpgrade = 0;
  157. if($money>=20000 && $customerData["isPartner"]==0){
  158. $per = 0.05;
  159. $isUpgrade = 1;
  160. }
  161. $resData=[
  162. "childId"=>$customerData["id"],
  163. "childData"=>$customerData,
  164. "parentId"=>$parentData["id"],
  165. "parentData"=>$parentData,
  166. "per"=>$per,
  167. "money"=>$money,
  168. "commission"=>$money * $per,
  169. "isUpgrade"=>$isUpgrade
  170. ];
  171. return $resData;
  172. }
  173. /**
  174. * 订单消费计算佣金
  175. * @param type $orderCustomerId
  176. * @param type $orderMoney
  177. * @param type $isPart 订单用户如果是合伙人是否计算
  178. * @return bool
  179. */
  180. public function addCalcMoneyData($orderId){
  181. //获取订单信息
  182. if(empty($orderId)){
  183. return false;
  184. }
  185. $dbOrderIndex = new DOrderIndex();
  186. $dbOrderIndex->setTable('qianniao_order_index_' . $this->enterpriseId);
  187. $orderIndexData = $dbOrderIndex->get(['id'=>$orderId]);
  188. if(empty($orderIndexData)){
  189. return false;
  190. }
  191. // 切换订单分表,查询订单主单据数据
  192. $dbOrder = new DOrder('default');
  193. $fix = ceil($orderIndexData['userCenterId'] / 200000);
  194. $dbOrder->setTable('qianniao_order_' . $this->onlineEnterpriseId . '_' . $fix);
  195. $orderData = $dbOrder->get(['id' => $orderId]);
  196. if(empty($orderData)){
  197. return false;
  198. }
  199. //开始计算
  200. $isPart=false;//订单用户如果是合伙人是否计算
  201. $orderCustomerId = $orderData["customerId"];
  202. $orderMoney = $orderData["payAmount'"];
  203. //只计算小程序已完成订单
  204. if(empty($orderCustomerId) || empty($orderMoney) || $orderData["payType"]!=1 || $orderData["source"]!=3 || $orderData["orderStatus"]!=5){
  205. return false;
  206. }
  207. $customerData = $this->dbCustomer->get($orderCustomerId);
  208. if (empty($customerData) || empty($customerData["parentPath"])) {
  209. return false;
  210. }
  211. //订单用户如果是合伙人消费则不计算收益
  212. if(!$isPart && $customerData["isPartner"]==1){
  213. return false;
  214. }
  215. $data=[];
  216. $nowTime = time();
  217. //计算低层收益
  218. $bottomData = $this->calcMoney($customerData,$orderMoney);
  219. if(empty($bottomData)){
  220. return false;
  221. }
  222. //合伙人账户
  223. $bottomPartnerData = $this->getPartnerData($bottomData["parentData"]["id"], $bottomData["parentData"]["userCenterId"]);
  224. if(empty($bottomPartnerData)){
  225. return false;
  226. }
  227. //计算顶层收益
  228. $topData = $this->calcMoney($bottomData["parentData"],$bottomData["commission"]);
  229. if(!empty($topData)){
  230. $topPartnerData = $this->getPartnerData($topData["parentData"]["id"], $topData["parentData"]["userCenterId"]);
  231. if(empty($topPartnerData)){
  232. return false;
  233. }
  234. //记录顶层收益
  235. $data[]=[
  236. "orderMoney"=>$orderMoney,//订单支付金额
  237. "calcMoney"=>$topData["money"],//佣金计算金额
  238. "sourceCustomerId"=>$topData["childId"],//来源客户id
  239. "partnerId"=>$topPartnerData["id"],//收钱合伙人账号id
  240. "customerId"=>$topPartnerData["customerId"],//收钱合伙人
  241. "userCenterId"=>$topPartnerData["userCenterId"],//收钱合伙人
  242. "commission"=>$topData["commission"],//佣金金额
  243. "per"=>$topData["per"],//佣金比例
  244. "type"=>1,//1表示子级合伙人收益计算收益,0表示子级消费计算收益
  245. "orderId"=>$orderData["id"],
  246. "status"=>0,
  247. "title"=>"合伙人收益分佣",
  248. "isUpgrade"=>$topData["isUpgrade"],
  249. "mono"=>"",
  250. "time"=>$nowTime,
  251. ];
  252. }
  253. //记录底层收益
  254. $data[]=[
  255. "orderMoney"=>$orderMoney,//订单支付金额
  256. "calcMoney"=>$bottomData["money"],//佣金计算金额
  257. "sourceCustomerId"=>$bottomData["childId"],//来源客户id
  258. "partnerId"=>$bottomPartnerData["id"],//收钱合伙人账号id
  259. "customerId"=>$bottomPartnerData["customerId"],//收钱合伙人
  260. "userCenterId"=>$bottomPartnerData["userCenterId"],//收钱合伙人
  261. "commission"=>$bottomData["commission"],//佣金金额
  262. "per"=>$bottomData["per"],//佣金比例
  263. "type"=>0,
  264. "orderId"=>$orderData["id"],
  265. "status"=>0,
  266. "title"=>"子级消费分佣",
  267. "isUpgrade"=>$bottomData["isUpgrade"],
  268. "mono"=>"",
  269. "time"=>$nowTime,
  270. "partnerId"=>$bottomPartnerData["id"],
  271. ];
  272. $num=0;
  273. foreach($data as $k=>$v){
  274. $count = $this->dbNewCommissionDetail->count(["orderId"=>$v["orderId"],"partnerId"=>$v["partnerId"]]);
  275. if($count>0){
  276. continue;
  277. }
  278. $id = $this->dbNewCommissionDetail->insert($v);
  279. if(!empty($id)){
  280. $num++;
  281. }
  282. }
  283. if($num<=0){
  284. return false;
  285. }
  286. //佣金更新完后验证设置合伙人
  287. if($bottomData["isUpgrade"]==1){
  288. $this->setPartner($bottomData["childId"]);
  289. }
  290. return true;
  291. }
  292. public function getPartnerData($customerId,$userCenterId){
  293. if(empty($customerId)){
  294. return false;
  295. }
  296. $partnerData = $this->dbNewCommissionPartner->get(["customerId"=>$customerId]);
  297. if(empty($partnerData)){
  298. $nowTime = time();
  299. $partnerData=[
  300. "userCenterId"=>$userCenterId,
  301. "customerId"=>$customerId,
  302. "balance"=>0,
  303. "waitMoney"=>0,
  304. "withdraw"=>0,
  305. "totalMoney"=>0,
  306. "deleteStatus"=>5,
  307. "createTime"=>$nowTime,
  308. "updateTime"=>$nowTime,
  309. "expand"=>"",
  310. ];
  311. $partnerId = $this->dbNewCommissionPartner->insert($partnerData);
  312. if(empty($partnerId)){
  313. return false;
  314. }
  315. $partnerData["id"] = $partnerId;
  316. }
  317. return $partnerData;
  318. }
  319. /**
  320. * 删除用户缓存
  321. * @param type $customerId
  322. * @param type $userCenterId
  323. */
  324. public function delCustomerCache($customerId,$userCenterId){
  325. $objCustomerCache = new CustomerCache();
  326. $objCustomerCache->delCustomerData($this->enterpriseId, $customerId);
  327. $objCustomerCache->delCustomerUserData($this->enterpriseId, $userCenterId);
  328. }
  329. }