CommissionsDetail.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | 萤火商城系统 [ 致力于通过产品和服务,帮助商家高效化开拓市场 ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2017~2021 https://www.yiovo.com All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed 这不是一个自由软件,不允许对程序代码以任何形式任何目的的再发行
  8. // +----------------------------------------------------------------------
  9. // | Author: 萤火科技 <admin@yiovo.com>
  10. // +----------------------------------------------------------------------
  11. declare (strict_types = 1);
  12. namespace app\api\model\user;
  13. use app\api\model\Order;
  14. use app\api\model\OrderGoods;
  15. use app\api\model\OrderRefund;
  16. use app\api\model\shop\Shops;
  17. use app\api\model\User;
  18. use app\common\library\helper;
  19. use app\common\model\user\CommissionsDetail as CommissionsDetailModel;
  20. use Exception;
  21. use think\facade\Log;
  22. /**
  23. * 待结算分佣明细模型
  24. * Class Store
  25. * @package app\store\model
  26. */
  27. class CommissionsDetail extends CommissionsDetailModel
  28. {
  29. /**
  30. *新增待结算分佣明细
  31. * @param int $userId
  32. * @param $orderId
  33. * @param $orderCreateTime
  34. * @param $clearing_money
  35. * @param int $shopId
  36. * @param int $buyerUserId
  37. * @param int $role
  38. * @param int $commissionLevel
  39. * @param $seller_grade
  40. * @param int $percent
  41. * @param int $orderSaleVolume
  42. * @return bool
  43. */
  44. public static function addNewCommission(int $userId, $orderId, $orderCreateTime,$clearing_money, int $shopId, $buyerUserId=0, $role=User::SHOP_SELLER, $commissionLevel=1,$seller_grade=0,$percent=0,$orderSaleVolume=0): bool
  45. {
  46. try {
  47. //if($clearing_money > 0 && $user_id > 0){//结算金额是0也写分佣记录,是为了方便查看订单查询
  48. if($userId > 0){
  49. $mc = new CommissionsDetail();
  50. $mc->user_id = $userId;
  51. $mc->order_id = $orderId;
  52. $mc->clearing_money = $clearing_money;
  53. $mc->shop_id = $shopId;
  54. $mc->role = $role;
  55. $mc->buyer_user_id = $buyerUserId;
  56. $mc->commission_level = $commissionLevel;
  57. $mc->seller_grade = $seller_grade;
  58. $mc->commission_percent = $percent;
  59. $mc->order_create_time = $orderCreateTime;
  60. $mc->order_sale_volume = $orderSaleVolume;
  61. $mc->save();
  62. }
  63. }catch (Exception $e){
  64. Log::error("addNewCommission::".$orderId.$e->getMessage());
  65. return false;
  66. }
  67. return true;
  68. }
  69. /**
  70. * 佣金结算列表
  71. * @param $userId
  72. * @param int $clearingStatus
  73. * @param false $isShop
  74. * @return array
  75. * @throws \think\db\exception\DataNotFoundException
  76. * @throws \think\db\exception\DbException
  77. * @throws \think\db\exception\ModelNotFoundException
  78. */
  79. public static function getCommsList($userId,$clearingStatus=0,$isShop = false){
  80. if ($isShop == true){
  81. return self::field('clearing_money,clearing_status,order_id,order_goods_id,create_time')
  82. ->with(['order_goods'=>function($query){
  83. $query->field('order_goods_id,goods_name');
  84. },'orders'=>function($query){
  85. $query->field('order_id,order_no,order_status,pay_status');
  86. }])->where('shop_id',$userId)
  87. ->find()->toArray();
  88. }
  89. /* ,IF
  90. ((create_time + 1296000) > unix_timestamp( now( ) ),
  91. CEILING( ( ( create_time + 1296000 ) - unix_timestamp( now( ) ) ) / 86400 ),"" ) as clearing_by*/
  92. return self::field('id as commission_id,TRUNCATE(clearing_money,2) as clearing_money,clearing_status,order_id,create_time')
  93. ->with(['order_goods'=>function($query){
  94. $query->field('order_goods_id,goods_name,image_id,IF(commission_settlement_time>0 && commission_settlement_time>unix_timestamp(),CEILING((commission_settlement_time-unix_timestamp())/86400),"" ) as clearing_by');
  95. },'orders'=>function($query){
  96. $query->field('order_id,order_no,order_status,pay_status,delivery_status,create_time,receipt_status,delivery_time');
  97. }])->where('user_id',$userId)
  98. ->where('clearing_status',$clearingStatus)
  99. ->order('id','desc')
  100. ->paginate(10)->toArray();
  101. }
  102. /**
  103. * 佣金结算列表 按订单
  104. * @param $userId
  105. * @param int $clearingStatus
  106. * @return array
  107. * @throws \think\db\exception\DbException
  108. */
  109. public static function getCommsListOrder($userId,$clearingStatus=0): array
  110. {
  111. return self::field('id,TRUNCATE(clearing_money,2) as clearing_money,clearing_status,order_id,create_time,role,commission_level')
  112. ->with(['orders'=>function($query){
  113. $query->field('order_id,order_no,create_time,order_status,pay_status,delivery_status,receipt_status,delivery_time,pay_price,rice_card_money');
  114. },'goods'=>function($query){
  115. $query->field('order_goods_id,goods_name,image_id');
  116. }])->where('user_id',$userId)
  117. ->where('clearing_status',$clearingStatus)
  118. ->order('id','desc')
  119. ->paginate(10)->each(function(&$item){
  120. $item['orders']['total_pay'] = helper::bcadd($item['orders']['pay_price'],$item['orders']['rice_card_money'],2);
  121. })->toArray();
  122. }
  123. public static function getCommOrderId($userId,$from,$to){
  124. $model = self::field( 'distinct order_id')
  125. ->where('user_id',$userId);
  126. return $model->whereBetweenTime('order_create_time', $from, $to)
  127. ->column('order_id');
  128. }
  129. /**
  130. * 我的收益金-退款订单
  131. */
  132. public static function getRefundOrderList($userId) {
  133. $from = 1577808001;$to=time();
  134. $orderGoodsId = self::getCommOrderId($userId,$from,$to);
  135. //整单退款
  136. $refundOrderId = OrderRefund::whereIn('order_id',$orderGoodsId)->where('order_goods_id',0)
  137. ->column('order_id');
  138. //非整单退款
  139. $refundOrderGoodsId = OrderRefund::whereIn('order_id',$orderGoodsId)->where('order_goods_id','>',0)
  140. ->column('order_goods_id');
  141. if (!count($refundOrderId) && !count($refundOrderGoodsId)){
  142. return [];
  143. }
  144. return CommissionsDetail::alias('cd')
  145. ->field('cd.*,order.order_no')
  146. ->with(['order_goods'=>function($query){
  147. $query->field('order_goods_id,goods_name,image_id,goods_price,total_num,total_price');
  148. },'order_refund'=>function($query){
  149. $query->field('*');
  150. },'order_refund_all'=>function($query){
  151. $query->field('*');
  152. }])
  153. ->leftJoin('order', 'order.order_id=cd.order_id')
  154. ->where('cd.user_id', $userId)
  155. ->where(function ($query) use ($refundOrderId,$refundOrderGoodsId){
  156. if (count($refundOrderId) && count($refundOrderGoodsId)){
  157. $query->whereIn('cd.order_id',$refundOrderId)->whereOr('cd.order_goods_id','in',$refundOrderGoodsId);
  158. }
  159. if (count($refundOrderId) && !count($refundOrderGoodsId)){
  160. $query->whereIn('cd.order_id',$refundOrderId);
  161. }
  162. if (count($refundOrderGoodsId) && !count($refundOrderId)){
  163. $query->whereIn('cd.order_goods_id',$refundOrderGoodsId);
  164. }
  165. })
  166. ->order('cd.update_time', 'desc')
  167. ->paginate(100)
  168. ->each(function($item) {
  169. if (empty($item->order_refund)) {
  170. // 整单退款
  171. $orderRefund = $item->order_refund_all[0]??null;
  172. $item->refund_goods_amount = $item->order_goods->total_price;
  173. } else {
  174. $orderRefund = $item->order_refund;
  175. $item->refund_goods_amount = helper::bcmul($item->order_goods->goods_price, $orderRefund->goods_num, 2);
  176. }
  177. unset($item->order_refund, $item->order_refund_all);
  178. $item->order_refund = $orderRefund;
  179. })
  180. ->toArray();
  181. }
  182. /**
  183. * 关联单个订单商品表
  184. * @return \think\model\relation\BelongsTo
  185. */
  186. public function orderGoods()
  187. {
  188. return $this->belongsTo(OrderGoods::class,'order_goods_id','order_goods_id')->withoutField(['content']);
  189. }
  190. /**
  191. * 关联全部订单商品
  192. */
  193. public function orderGoodsAll()
  194. {
  195. return $this->hasMany(OrderGoods::class, 'order_id', 'order_id')->withoutField(['content']);
  196. }
  197. /**
  198. * 关联单个退款
  199. */
  200. public function orderRefund(){
  201. return $this->belongsTo(OrderRefund::class,'order_goods_id','order_goods_id');
  202. }
  203. /**
  204. * 关联整单退款
  205. */
  206. public function orderRefundAll()
  207. {
  208. return $this->hasMany(OrderRefund::class, 'order_id', 'order_id');
  209. }
  210. public function orders(){
  211. return $this->belongsTo(Order::class,'order_id','order_id');
  212. }
  213. /**
  214. * Notes:获取用户今日收益
  215. * Author: zhangs
  216. * DateTime: 2021/10/9 14:21
  217. * @param $userId
  218. * @return float
  219. */
  220. public static function getUserTodayProfits($userId)
  221. {
  222. return self::where('user_id', $userId)
  223. ->where('clearing_status', '<>', self::CLEARING_STATUS_REFUND)
  224. ->whereDay('create_time')
  225. ->sum('clearing_money');
  226. }
  227. public static function getCommissionOrders($userId,$dataType='',$type=0,$from=null,$to=null,$keyword = null,$shopId=null){
  228. $user = User::find($userId);
  229. $shopId = $shopId?:$user->shop_id;
  230. $sellerUser = null;
  231. $buyers = null;
  232. if ($keyword){
  233. $buyers = User::where('nick_name','like',$keyword)->whereOr('mobile','like',$keyword)->select()->column('user_id');
  234. }
  235. //$pool = $orderGoods['total_price'] - $orderGoods['distributor_total_money'];//实付金额加现金米卡抵扣金额
  236. $m = self::field('commission_id,commissions_detail.user_id,commissions_detail.order_goods_id,round(commissions_detail.clearing_money,2) as clearing_money,commissions_detail.order_id,commissions_detail.commission_level')
  237. ->withJoin([
  238. 'orderGoods'=>['order_goods_id','goods_name','total_num','total_pay_price','image_id','user_id','frozen_status','total_price','distributor_total_money','coupon_money','rice_card_money'],
  239. 'orders'=>['order_id','order_no','order_status','pay_status','delivery_status','create_time','receipt_status','delivery_time'],
  240. 'recommender'=>['user_id','nick_name'],
  241. ]);
  242. $m = $m->where('commissions_detail.user_id',$userId)->where('commissions_detail.shop_id',$shopId);
  243. if ($dataType){
  244. $order = new Order();
  245. $filters =$order->getFilter($dataType);
  246. if (count($filters)){
  247. foreach ($filters as $key =>$filter){
  248. //$field = 'orders.'.$key;
  249. $m = $m->where('orders.'.$key,$filter);
  250. }
  251. }
  252. }
  253. if ($type == 1 && $from && $to) {
  254. $m = $m->whereBetweenTime('orders.create_time', $from, $to);
  255. }
  256. if ($type == 2) {
  257. $m = $m->whereDay('orders.create_time', $from);
  258. }
  259. if ($type == 3) {
  260. $m = $m->whereMonth('orders.create_time', $from);
  261. }
  262. if ($buyers && count($buyers)){
  263. $m = $m->whereIn('orders.user_id',$buyers);
  264. }
  265. return $m->order('commission_id','desc')->paginate(10)->toArray();
  266. }
  267. public static function getCommissionOrdersNew($userId,$dataType='',$type=0,$from=null,$to=null,$keyword = null,$shopId=null,$isDown=0): array
  268. {
  269. $user = User::find($userId);
  270. $shopId = $shopId?:$user->shop_id;
  271. $sellerUser = null;
  272. $buyers = null;
  273. if ($keyword){
  274. $buyers = User::where('nick_name','like',$keyword)->whereOr('mobile','like',$keyword)->select()->column('user_id');
  275. }
  276. $m = CommissionsDetail::field('id,commissions_detail.user_id,round(commissions_detail.clearing_money,2) as clearing_money,commissions_detail.order_id,commissions_detail.commission_level,buyer_user_id,clearing_status')
  277. ->withJoin([
  278. 'orders'=>['order_id','order_no','order_status','pay_status','delivery_status','create_time','receipt_status','delivery_time','pay_price','rice_card_money','user_id'],
  279. //'recommender'=>['user_id','nick_name'],
  280. ])
  281. ->with(['goods'=>function($query){
  282. $query->field('order_id','order_goods_id','goods_name','total_num','total_pay_price','image_id','user_id','frozen_status','total_price','distributor_total_money','coupon_money');
  283. }]);
  284. $isCommer = ($user->role == User::COMMISSION_USER);
  285. //下级分销员推广订单
  286. if ($isDown == 1 && $isCommer){
  287. $m = $m->leftJoin('user','commissions_detail.user_id=user.user_id')->where('user.upper_user_id',$userId);
  288. //$m = $m->where('commissions_detail.commission_level',2);
  289. }elseif ($isCommer){//分销员自己推广的一级订单
  290. $m = $m->where('commissions_detail.user_id',$userId)
  291. ->where('commissions_detail.commission_level',1);
  292. }else{//店员,店长
  293. $m = $m->where('commissions_detail.user_id',$userId);
  294. }
  295. /* $m = $m->where('commissions_detail.commission_level',1)
  296. ->where('commissions_detail.shop_id',$shopId);*/
  297. $m = $m->where('commissions_detail.shop_id',$shopId);
  298. if ($dataType){
  299. $order = new Order();
  300. $filters =$order->getFilter($dataType);
  301. if (count($filters)){
  302. foreach ($filters as $key =>$filter){
  303. //$field = 'orders.'.$key;
  304. $m = $m->where('orders.'.$key,$filter);
  305. }
  306. }
  307. }
  308. if ($type == 1 && $from && $to) {
  309. $m = $m->whereBetweenTime('orders.create_time', $from, $to);
  310. }
  311. if ($type == 2) {
  312. $m = $m->whereDay('orders.create_time', $from);
  313. }
  314. if ($type == 3) {
  315. $m = $m->whereMonth('orders.create_time', $from);
  316. }
  317. if ($buyers && count($buyers)){
  318. $m = $m->whereIn('orders.user_id',$buyers);
  319. }
  320. return $m->order('id','desc')
  321. ->paginate(10)
  322. ->each(function(&$item) use ($isDown,$isCommer){
  323. if ($isDown == 1 && $isCommer){//当前推荐官用户的下级推荐官数据都是二级佣金
  324. $item['commission_level'] = 2;
  325. $levelOneCom = CommissionsDetail::where('order_id',$item['order_id'])
  326. ->where('commission_level',2)->where('role',99)->field('clearing_money')
  327. ->find();
  328. $item['clearing_money'] = helper::bcadd($levelOneCom->clearing_money??0,0,2);
  329. }
  330. $staffUserId = Order::where('order_id',$item['order_id'])->field('staff_user_id')->find();
  331. $item['recommender'] = User::where('user_id',$staffUserId->staff_user_id)->field('user_id,nick_name')->find();
  332. $item['orders']['total_pay'] = helper::bcadd($item['orders']['pay_price'],$item['orders']['rice_card_money'],2);
  333. $buyer = User::with(['avatar'])->field('user_id,nick_name,avatar_id')->find($item['orders']['user_id']);
  334. $item['orders']['buyer'] = ['nick_name'=>$buyer['nick_name']??'',
  335. 'avatar'=>$buyer['avatar']['ali_url']??''
  336. ];
  337. })->toArray();
  338. }
  339. /**
  340. * 获取推荐人
  341. * @return \think\model\relation\BelongsTo
  342. */
  343. public function recommender(): \think\model\relation\BelongsTo
  344. {
  345. return $this->belongsTo(User::class,'user_id','user_id');
  346. }
  347. public static function getUserWaitCommission($userId,$state=0){
  348. return self::where('user_id',$userId)->where('clearing_status',$state)->sum('clearing_money');
  349. }
  350. /**
  351. * 累加门店某角色在时间范围内的已结算佣金
  352. * @param $shopId
  353. * @param $role
  354. * @param $from
  355. * @param $to
  356. * @return float
  357. */
  358. public static function sumUserCommission($shopId,$role,$from,$to): float
  359. {
  360. return self::alias('commissions_detail')
  361. ->where('commissions_detail.shop_id',$shopId)
  362. ->where('commissions_detail.role',$role)
  363. ->where('commissions_detail.clearing_status',1)
  364. ->whereBetweenTime('commissions_detail.order_create_time',$from,$to)
  365. ->sum('clearing_money');
  366. }
  367. /**
  368. * 用户的下级分销员的销售额
  369. * @param $userId
  370. * @return string
  371. */
  372. public static function sumUserCommSalesVolume($userId){
  373. $res = self::alias('commissions_detail')
  374. ->leftJoin('user','commissions_detail.user_id=user.user_id')
  375. ->where('user.upper_user_id',$userId)
  376. ->where('user.role',User::COMMISSION_USER)
  377. ->where('commissions_detail.commission_level',1)
  378. ->where('commissions_detail.clearing_status','<',2)
  379. ->field('commissions_detail.order_id')
  380. ->select()->column('order_id');
  381. $orderIds = array_unique($res);
  382. $volume = Order::sumSalesVolume($orderIds);
  383. $refund = OrderRefund::sumRefundPriceByOrder($orderIds);
  384. return helper::bcsub($volume,$refund,2);
  385. }
  386. /**
  387. * 用户的下级分销员的销售额
  388. * @param $userId
  389. * @return array
  390. */
  391. public static function sumUserSalesVolume($userId){
  392. $res = self::alias('commissions_detail_order')
  393. ->where('commissions_detail_order.user_id',$userId)
  394. ->where('commissions_detail_order.commission_level',1)
  395. ->where('commissions_detail_order.clearing_status','<',2)
  396. ->select()->column('order_id');
  397. $orderIds = array_unique($res);
  398. $orderCnt = count($orderIds);
  399. $volume = Order::sumSalesVolume($orderIds);
  400. $refund = OrderRefund::sumRefundPriceByOrder($orderIds);
  401. $amount = helper::bcsub($volume,$refund,2);
  402. return ['order_cnt'=>$orderCnt,'order_amount'=>$amount];
  403. }
  404. }