AwardIntegral.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | likeshop开源商城系统
  4. // +----------------------------------------------------------------------
  5. // | 欢迎阅读学习系统程序代码,建议反馈是我们前进的动力
  6. // | gitee下载:https://gitee.com/likeshop_gitee
  7. // | github下载:https://github.com/likeshop-github
  8. // | 访问官网:https://www.likeshop.cn
  9. // | 访问社区:https://home.likeshop.cn
  10. // | 访问手册:http://doc.likeshop.cn
  11. // | 微信公众号:likeshop技术社区
  12. // | likeshop系列产品在gitee、github等公开渠道开源版本可免费商用,未经许可不能去除前后端官方版权标识
  13. // | likeshop系列产品收费版本务必购买商业授权,购买去版权授权后,方可去除前后端官方版权标识
  14. // | 禁止对系统程序代码以任何目的,任何形式的再发布
  15. // | likeshop团队版权所有并拥有最终解释权
  16. // +----------------------------------------------------------------------
  17. // | author: likeshop.cn.team
  18. // +----------------------------------------------------------------------
  19. namespace app\common\command;
  20. use app\common\enum\OrderEnum;
  21. use app\common\logic\AccountLogLogic;
  22. use app\common\model\AccountLog;
  23. use app\common\model\DividendCashLog;
  24. use app\common\model\DividendOrder;
  25. use app\common\model\DividendOrderLog;
  26. use app\common\model\order\Order;
  27. use app\common\model\user\User;
  28. use app\common\server\ConfigServer;
  29. use think\console\Command;
  30. use think\console\Input;
  31. use think\console\Output;
  32. use think\facade\Log;
  33. class AwardIntegral extends Command
  34. {
  35. protected function configure()
  36. {
  37. $this->setName('award_integral')
  38. ->setDescription('结算消费赠送积分');
  39. }
  40. protected function execute(Input $input, Output $output)
  41. {
  42. try {
  43. $time = time();
  44. $config = ConfigServer::get('transaction', 'order_after_sale_days', 7);
  45. $finish_limit = $config * 24 * 60 * 60;
  46. $orders = Order::field(true)->where([
  47. ['del', '=', 0],
  48. ['award_integral_status', '>', 0],
  49. ['is_award_integral', '=', 0],
  50. ['pay_status', '=', 1]
  51. ])->order('id asc')->select()->toArray();
  52. foreach ($orders as $order) {
  53. if ($order['award_integral'] <= 0) {
  54. continue;
  55. }
  56. if ($order['award_integral_status'] == OrderEnum::ORDER_DELIVERY && $order['order_status'] < OrderEnum::ORDER_STATUS_GOODS) {
  57. continue;
  58. }
  59. if ($order['award_integral_status'] == OrderEnum::ORDER_FINISH && $order['order_status'] < OrderEnum::ORDER_STATUS_COMPLETE) {
  60. continue;
  61. }
  62. if ($order['award_integral_status'] == OrderEnum::ORDER_AFTER_SALE_OVER && ($order['order_status'] < OrderEnum::ORDER_STATUS_COMPLETE || ($finish_limit + $order['confirm_take_time']) > $time)) {
  63. continue;
  64. }
  65. User::where('id',$order['user_id'])->inc('user_integral', $order['award_integral'])->update();
  66. Order::update(['is_award_integral'=>1,'update_time'=>$time],['id'=>$order['id']]);
  67. AccountLogLogic::AccountRecord($order['user_id'], $order['award_integral'], 1, AccountLog::consume_award_integral, '', $order['id'], $order['order_sn']);
  68. $this->update_dividend_info($order);
  69. }
  70. return true;
  71. } catch (\Exception $e) {
  72. Log::write('结算消费赠送积分异常:'.$e->getMessage());
  73. return false;
  74. }
  75. }
  76. //更新分红信息
  77. protected function update_dividend_info($orders){
  78. // outFileLog($orders,'award_integral','orders');
  79. if(empty($orders)) return false;
  80. $dividend_cash = ConfigServer::get('platform_setting', 'dividend_cash', 0);
  81. $dividend_set_money = ConfigServer::get('platform_setting', 'dividend_set_money', 100);
  82. $dividend_rate = ConfigServer::get('platform_setting', 'dividend_rate', 0.04);
  83. $rebate_rate = ConfigServer::get('platform_setting', 'rebate_rate', 0.2);
  84. $change_money = $orders['order_amount']*$dividend_rate;
  85. $total_cash = $dividend_cash+$change_money;
  86. //更新分红池金额
  87. ConfigServer::set('platform_setting', 'dividend_cash', $total_cash);
  88. //添加分红池记录
  89. $this->addDividendCashLog($change_money,$orders['id'],1,$total_cash,'订单【'.$orders['order_sn'].'】增加分红池金额');
  90. //检查方法分红奖励
  91. $this->sendDividendCash();
  92. //增加排队列表
  93. $linret = $this->lineUp($orders,$dividend_set_money,$rebate_rate);
  94. return true;
  95. }
  96. //增加分红池资金变化记录
  97. public function addDividendCashLog($change_money,$order_id,$change_type,$dividend_cash,$remark,$shop_id=0){
  98. $saveData['change_type'] = $change_type;
  99. $saveData['order_id'] = $order_id;
  100. $saveData['change_money'] = $change_money;
  101. $saveData['total_money'] = $dividend_cash;
  102. $saveData['remark'] = $remark;
  103. $saveData['shop_id'] = $shop_id;
  104. $ret = DividendCashLog::create($saveData);
  105. return $ret;
  106. }
  107. //开始进入排队
  108. protected function lineUp($order,$dividend_set_money=100,$rebate_rate=0.2){
  109. $rated_money = ConfigServer::get('platform_setting', 'rated_money', 3000);//大额额定金额
  110. $rated_money_rate = ConfigServer::get('platform_setting', 'rated_money_rate', 0.04);//大额分红额定比例
  111. $order_money = $order['order_amount'];
  112. if($order_money >= $rated_money){
  113. $dividend_set_money = round($order_money*$rated_money_rate,2); //分红额定金额
  114. }
  115. $count = ceil($order_money/$dividend_set_money);
  116. // outFileLog($count,'award_integral','$count');
  117. if($count>1){
  118. $dividend_money = 0; //当前计入分红额度
  119. for($i = 0 ;$i<$count ;$i++){
  120. $j = $i+1;
  121. $flag_money = $dividend_set_money*$j;
  122. if($flag_money<$order_money){
  123. $dividend_money = $dividend_set_money;
  124. }else{
  125. $dividend_money = $order_money-$dividend_set_money*$i;
  126. }
  127. if($j<10){
  128. $sn = $order['order_sn'].'0'.$j;
  129. }else{
  130. $sn = $order['order_sn'].$j;
  131. }
  132. $this->createDividendOrder($order,$dividend_money,$rebate_rate,$dividend_set_money,$sn);
  133. }
  134. }else{
  135. $sn=$order['order_sn'].'01';
  136. $this->createDividendOrder($order,$order_money,$rebate_rate,$dividend_set_money,$sn);
  137. }
  138. }
  139. //创建排队信息
  140. /*
  141. * $money 计算进入分红的金额
  142. * $dividend_set_money 分红额定金额 满了结束排队
  143. * */
  144. public function createDividendOrder($order,$money,$rebate_rate,$dividend_set_money=100,$sn){
  145. //给排队第一个人加佣金
  146. $dowhere['status'] = 0;
  147. $doOrder = DividendOrder::where($dowhere)->order('id asc')->select()->toArray();
  148. if($doOrder){
  149. //插入排队表信息
  150. $this->createData($order,0,$dividend_set_money,$sn);
  151. $change_money = round($money*$rebate_rate,2);
  152. foreach($doOrder as &$dov){
  153. if($change_money<=0) break;
  154. $diff_money = $dov['rated_money'] - $dov['money'];
  155. if($diff_money>=$change_money){
  156. //变动金额达不到排队订单完结状态
  157. $this->updateUserDividendOrder($dov,$change_money,$order,$dividend_set_money,0);
  158. $change_money = 0;
  159. }else{
  160. //当前排队订单完结
  161. $change_money = $change_money-$diff_money;
  162. $this->updateUserDividendOrder($dov,$diff_money,$order,$dividend_set_money,1);
  163. }
  164. }
  165. }else {
  166. $data_money = round($money * $rebate_rate, 2);
  167. $this->createData($order,$data_money,$dividend_set_money,$sn);
  168. }
  169. return true ;
  170. }
  171. //插入排队信息以及记录
  172. protected function createData($order,$money,$dividend_set_money,$sn=''){
  173. //插入排队表信息
  174. $saveDividendOrderData['sn'] = $sn;
  175. $saveDividendOrderData['user_id'] = $order['user_id'];
  176. $saveDividendOrderData['order_id'] = $order['id'];
  177. $saveDividendOrderData['rated_money'] = $dividend_set_money;
  178. $saveDividendOrderData['money'] = $money;
  179. $saveDividendOrderData['status'] = 0;
  180. $addret = DividendOrder::create($saveDividendOrderData);
  181. $do_id = $addret['id'];
  182. $saveLogData['do_id'] = $do_id;
  183. $saveLogData['order_id'] = $order['id'];
  184. $saveLogData['money'] = $money;
  185. DividendOrderLog::create($saveLogData);
  186. return true ;
  187. }
  188. //更新排队订单信息
  189. public function updateUserDividendOrder($order,$change_money,$from_order,$dividend_set_money,$flag){
  190. $order_id = $from_order['id'];
  191. $id = $order['id'];
  192. $total_money = $order['money'] + $change_money;
  193. if($flag){
  194. //达到分红金额,排队结束,并扣减积分,钱转入可提现余额
  195. $updateDividendOrderData['status'] = 1;
  196. $dividend_cash = ConfigServer::get('platform_setting', 'dividend_cash', 0);
  197. if($dividend_cash>=$dividend_set_money){
  198. $updateDividendOrderData['is_exchange'] = 1;
  199. $this->changeIntegral($order,$order['user_id'],$order['rated_money']);
  200. }
  201. }
  202. $updateDividendOrderData['money'] = $total_money;
  203. $updateDividendOrderData['update_time'] = time();
  204. DividendOrder::where(['id'=>$id])->update($updateDividendOrderData);
  205. $saveLogData['do_id'] = $id;
  206. $saveLogData['order_id'] = $order_id;
  207. $saveLogData['money'] = $change_money;
  208. DividendOrderLog::create($saveLogData);
  209. return true;
  210. }
  211. public function sendDividendCash(){
  212. $dividend_cash = ConfigServer::get('platform_setting', 'dividend_cash', 0);
  213. $dowhere['status'] = 1;
  214. $dowhere['is_exchange'] = 0;
  215. $doOrder = DividendOrder::where($dowhere)->order('id asc')->select()->toArray();
  216. foreach ($doOrder as &$dov){
  217. if($dividend_cash >= $dov['rated_money']){
  218. $this->changeIntegral($dov,$dov['user_id'],$dov['rated_money']);
  219. }
  220. }
  221. }
  222. /*
  223. *
  224. * $change_integral 变动积分 额定金额
  225. * */
  226. public function changeIntegral($order,$user_id,$change_integral){
  227. //减少分红池金额
  228. $dividend_cash = ConfigServer::get('platform_setting', 'dividend_cash', 0);
  229. $new_dividend_cash = $dividend_cash - $change_integral;
  230. if($new_dividend_cash < 0 ) return true;
  231. // outFileLog($new_dividend_cash,'award_integral','$total_cash2');
  232. ConfigServer::set('platform_setting', 'dividend_cash', $new_dividend_cash);
  233. //扣减积分
  234. $user_info = User::find($user_id);
  235. $user_info->user_integral = $user_info->user_integral - $change_integral;
  236. $user_info->earnings = $user_info->earnings + $change_integral;
  237. $user_info->save();
  238. //扣减积分记录
  239. AccountLogLogic::AccountRecord($order['user_id'], $change_integral, 2, AccountLog::integral_dividend, '分红池分红奖金提现消耗积分', $order['id'], '');
  240. //增加佣金
  241. AccountLogLogic::AccountRecord($user_id,$change_integral,1,AccountLog::dividend_inc_earnings, '分红池分红增加佣金', $order['id']);
  242. //添加分红池记录
  243. $this->addDividendCashLog($change_integral,$order['id'],2,$new_dividend_cash,'分红订单【'.$order['sn'].'】分红后减少分红池金额');
  244. //更新排队订单的支付状态
  245. $updateDividendOrderData['is_exchange'] = 1;
  246. $updateDividendOrderData['update_time'] = time();
  247. DividendOrder::where(['id'=>$order['id']])->update($updateDividendOrderData);
  248. return true ;
  249. }
  250. }