SettleService.php 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | LARAVEL8.0 框架 [ LARAVEL ][ RXThinkCMF ]
  4. // +----------------------------------------------------------------------
  5. // | 版权所有 2017~2021 LARAVEL研发中心
  6. // +----------------------------------------------------------------------
  7. // | 官方网站: http://www.laravel.cn
  8. // +----------------------------------------------------------------------
  9. // | Author: laravel开发员 <laravel.qq.com>
  10. // +----------------------------------------------------------------------
  11. namespace App\Services\Api;
  12. use App\Models\AccountLogModel;
  13. use App\Models\AgentModel;
  14. use App\Models\MemberModel;
  15. use App\Models\OrderModel;
  16. use App\Models\PayOrdersModel;
  17. use App\Models\StoreCategoryModel;
  18. use App\Models\StoreModel;
  19. use App\Services\BaseService;
  20. use App\Services\ConfigService;
  21. use App\Services\RedisService;
  22. use Illuminate\Support\Facades\DB;
  23. /**
  24. * 结算管理-服务类
  25. * @author laravel开发员
  26. * @since 2020/11/11
  27. * @package App\Services\Api
  28. */
  29. class SettleService extends BaseService
  30. {
  31. /**
  32. * 构造函数
  33. * @author laravel开发员
  34. * @since 2020/11/11
  35. */
  36. public function __construct()
  37. {
  38. $this->model = new AccountLogModel();
  39. }
  40. /**
  41. * 静态入口
  42. * @return static|null
  43. */
  44. public static function make()
  45. {
  46. if (!self::$instance) {
  47. self::$instance = (new static());
  48. }
  49. return self::$instance;
  50. }
  51. /**
  52. * 商家收益结算
  53. * @param $storeId
  54. * @param $money 收益
  55. * @param $order 订单数据
  56. * @return array|false|int
  57. */
  58. public function storeBonus($storeId, $money, $order)
  59. {
  60. $orderNo = isset($order['order_no'])? $order['order_no'] : '';
  61. if($money<=0 && $storeId<=0){
  62. $this->error = '无商家佣金可结算';
  63. return false;
  64. }
  65. $storeInfo = StoreModel::where(['id'=> $storeId,'mark'=>1])->first();
  66. $balance = isset($storeInfo['balance'])? $storeInfo['balance'] : 0;
  67. $storeUserId = isset($storeInfo['user_id'])? $storeInfo['user_id'] : 0;
  68. if($storeUserId<=0){
  69. $this->error = '商家账号错误';
  70. return false;
  71. }
  72. if(!StoreModel::where(['id'=> $storeId])->update(['balance'=>DB::raw("balance + {$money}"),'income'=>DB::raw("income + {$money}"),'update_time'=>time()])){
  73. $this->error = '收货错误,商家结算错误,请联系客服处理';
  74. return -1;
  75. }
  76. $log = [
  77. 'user_id'=> $storeUserId,
  78. 'source_order_no'=> isset($order['order_no'])? $order['order_no'] : '',
  79. 'type'=> 7,
  80. 'money'=> $money,
  81. 'before_money'=> $balance,
  82. 'date'=>date('Y-m-d'),
  83. 'create_time'=>time(),
  84. 'remark'=> '商家收益',
  85. 'status'=>1
  86. ];
  87. if(!$id = $this->model->insertGetId($log)){
  88. $this->error = '商家收益结算失败,请联系客服处理';
  89. return -1;
  90. }
  91. $result = ['id'=>$id,'store_id'=>$storeId,'bonus'=>$money];
  92. if(env('APP_DEBUG')){
  93. RedisService::set("caches:settle:{$orderNo}:store_{$storeId}", $result, 7200);
  94. }
  95. return $result;
  96. }
  97. /**
  98. * 代理收益
  99. * @param $userId
  100. * @param $bonus
  101. * @param $order
  102. * @param $recBonusId
  103. * @param int $type
  104. * @return array|false|int
  105. */
  106. public function agentBonus($userId, $bonus, $order, $recBonusId, $type=0)
  107. {
  108. $orderId = isset($order['id'])? $order['id'] : 0;
  109. $total = isset($order['pay_total'])? $order['pay_total'] : 0;
  110. $recBonusSettle = isset($order['order_no']) && $order['rec_bonus_settle']? $order['rec_bonus_settle'] : 2;
  111. if($orderId<=0 || $bonus<=0 || $userId<=0 || $recBonusId<=0){
  112. $this->error = '无收益可结算';
  113. return false;
  114. }
  115. if($recBonusSettle == 1){
  116. $this->error = '收益已结算';
  117. return 0;
  118. }
  119. $parent = AgentModel::with(['user'])->where(['user_id'=> $recBonusId,'status'=>1,'mark'=>1])
  120. ->select(['id','balance','user_id','income','status'])
  121. ->first();
  122. $agentId = isset($parent['id'])? $parent['id'] : 0;
  123. $balance = isset($parent['balance'])? $parent['balance'] : 0;
  124. $parentInfo = isset($parent['user'])? $parent['user'] : [];
  125. $parentOneId = isset($parentInfo['parent_id'])? $parentInfo['parent_id'] :0;
  126. // 推荐消费者的佣金
  127. $logs = [];
  128. if(empty($parent) || $agentId<=0){
  129. $this->error = '上级代理无效';
  130. return 0;
  131. }
  132. if(!AgentModel::where(['id'=> $agentId])->update(['balance'=>DB::raw("balance + {$bonus}"),'income'=>DB::raw("income + {$bonus}"),'order_count'=>DB::raw("order_count + 1"),'update_time'=>time()])){
  133. $this->error = '推荐消费者收益结算错误,请联系客服处理';
  134. return -1;
  135. }
  136. $logs[] = [
  137. 'user_id'=> $recBonusId,
  138. 'source_order_no'=> isset($order['order_no'])? $order['order_no'] : '',
  139. 'type'=> 9,
  140. 'money'=> $bonus,
  141. 'before_money'=> $balance,
  142. 'date'=>date('Y-m-d'),
  143. 'create_time'=>time(),
  144. 'remark'=> '推广收益',
  145. 'remark1'=> ['','话费充值','电费充值','燃气充值'][$type],
  146. 'status'=>1
  147. ];
  148. // 一级代理收益
  149. $parentTwoId = 0;
  150. $oneBonus = 0;
  151. if($bonus>0 && $parentOneId){
  152. $parentOne = AgentModel::with(['user'])->where(['user_id'=> $parentOneId,'status'=>1,'mark'=>1])
  153. ->select(['id','balance','user_id','income','status'])
  154. ->first();
  155. $oneId = isset($parentOne['id'])? $parentOne['id'] : 0;
  156. $oneBalance = isset($parentOne['balance'])? $parentOne['balance'] : 0;
  157. $oneInfo = isset($parentOne['user'])? $parentOne['user'] : [];
  158. $parentTwoId = isset($oneInfo['parent_id'])? $oneInfo['parent_id'] :0;
  159. $agentBonusLevel1Rate = ConfigService::make()->getConfigByCode('agent_bonus_level1_rate', 0);
  160. $agentBonusLevel1Rate = $agentBonusLevel1Rate>0 && $agentBonusLevel1Rate<100? $agentBonusLevel1Rate : 0;
  161. $oneBonus = moneyFormat($agentBonusLevel1Rate * $bonus/100, 4);
  162. if($oneBonus>=0.01){
  163. if(!AgentModel::where(['id'=> $oneId])->update(['balance'=>DB::raw("balance + ".moneyFormat($oneBonus,2)),'income'=>DB::raw("income + ".moneyFormat($oneBonus,2)),'order_count'=>DB::raw("order_count + 1"),'update_time'=>time()])){
  164. $this->error = '推荐代理收益结算错误,请联系客服处理';
  165. return -1;
  166. }
  167. $logs[] = [
  168. 'user_id'=> $parentOneId,
  169. 'source_order_no'=> isset($order['order_no'])? $order['order_no'] : '',
  170. 'type'=> 8,
  171. 'money'=> moneyFormat($oneBonus,2),
  172. 'before_money'=> $oneBalance,
  173. 'date'=>date('Y-m-d'),
  174. 'create_time'=>time()+1,
  175. 'remark'=> '一级代理收益',
  176. 'remark1'=> ['','话费充值','电费充值','燃气充值'][$type],
  177. 'status'=>1
  178. ];
  179. }
  180. }
  181. // 二级代理收益
  182. $twoBonus = 0;
  183. if($bonus>0 && $parentTwoId){
  184. $parentTwo = AgentModel::with(['user'])->where(['user_id'=> $parentTwoId,'status'=>1,'mark'=>1])
  185. ->select(['id','balance','user_id','income','status'])
  186. ->first();
  187. $twoId = isset($parentTwo['id'])? $parentTwo['id'] : 0;
  188. $twoBalance = isset($parentTwo['balance'])? $parentTwo['balance'] : 0;
  189. $agentBonusLevel2Rate = ConfigService::make()->getConfigByCode('agent_bonus_level2_rate', 0);
  190. $agentBonusLevel2Rate = $agentBonusLevel2Rate>0 && $agentBonusLevel2Rate<100? $agentBonusLevel2Rate : 0;
  191. $twoBonus = moneyFormat($agentBonusLevel2Rate * $bonus/100, 4);
  192. if($twoBonus>=0.01){
  193. if(!AgentModel::where(['id'=> $twoId])->update(['balance'=>DB::raw("balance + ".moneyFormat($twoBonus,2)),'income'=>DB::raw("income + ".moneyFormat($twoBonus,2)),'order_count'=>DB::raw("order_count + 1"),'update_time'=>time()])){
  194. $this->error = '推荐代理收益结算错误,请联系客服处理';
  195. return -1;
  196. }
  197. $logs[] = [
  198. 'user_id'=> $parentTwoId,
  199. 'source_order_no'=> isset($order['order_no'])? $order['order_no'] : '',
  200. 'type'=> 8,
  201. 'money'=> moneyFormat($twoBonus,2),
  202. 'before_money'=> $twoBalance,
  203. 'date'=>date('Y-m-d'),
  204. 'create_time'=>time()+2,
  205. 'remark'=> '二级代理收益',
  206. 'remark1'=> ['','话费充值','电费充值','燃气充值'][$type],
  207. 'status'=>1
  208. ];
  209. }
  210. }
  211. if($logs && !$this->model->insert($logs)){
  212. $this->error = '推荐代理收益结算错误,请联系客服处理';
  213. return -1;
  214. }
  215. // 更新订单结算状态
  216. $model = $type>0? new PayOrdersModel() : new OrderModel();
  217. if(!$model::where(['id'=>$orderId])->update(['rec_bonus_settle'=>1,'update_time'=>time()])){
  218. $this->error = '收益结算状态更新失败';
  219. return -1;
  220. }
  221. $result = ['user_id'=>$userId,'total'=> $total,'bonus'=>$bonus,'parent_id'=>$recBonusId,'oneId'=>$parentOneId,'oneBonus'=>$oneBonus,'twoId'=>$parentTwoId,'twoBonus'=>$twoBonus];
  222. return $result;
  223. }
  224. }