DistributionSettlement.php 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | likeshop100%开源免费商用商城系统
  4. // +----------------------------------------------------------------------
  5. // | 欢迎阅读学习系统程序代码,建议反馈是我们前进的动力
  6. // | 开源版本可自由商用,可去除界面版权logo
  7. // | 商业版本务必购买商业授权,以免引起法律纠纷
  8. // | 禁止对系统程序代码以任何目的,任何形式的再发布
  9. // | gitee下载:https://gitee.com/likeshop_gitee
  10. // | github下载:https://github.com/likeshop-github
  11. // | 访问官网:https://www.likeshop.cn
  12. // | 访问社区:https://home.likeshop.cn
  13. // | 访问手册:http://doc.likeshop.cn
  14. // | 微信公众号:likeshop技术社区
  15. // | likeshop团队 版权所有 拥有最终解释权
  16. // +----------------------------------------------------------------------
  17. // | author: likeshopTeam
  18. // +----------------------------------------------------------------------
  19. namespace app\common\command;
  20. use app\adminapi\logic\distribution\DistributionConfigLogic;
  21. use app\adminapi\logic\distribution\DistributionLevelLogic;
  22. use app\common\enum\AccountLogEnum;
  23. use app\common\enum\AfterSaleEnum;
  24. use app\common\enum\DistributionOrderGoodsEnum;
  25. use app\common\enum\NoticeEnum;
  26. use app\common\enum\OrderEnum;
  27. use app\common\logic\AccountLogLogic;
  28. use app\common\model\AfterSale;
  29. use app\common\model\User;
  30. use app\common\model\DistributionOrderGoods;
  31. use app\common\model\OrderGoods;
  32. use think\console\Command;
  33. use think\console\Input;
  34. use think\console\Output;
  35. use think\facade\Db;
  36. use think\facade\Log;
  37. /**
  38. * 分销结算命令
  39. * Class DistributionSettlement
  40. * @package app\command
  41. */
  42. class DistributionSettlement extends Command
  43. {
  44. protected function configure()
  45. {
  46. $this->setName('distribution_settlement')
  47. ->setDescription('结算分销订单');
  48. }
  49. protected function execute(Input $input, Output $output)
  50. {
  51. // 结算时间
  52. $config = DistributionConfigLogic::getConfig();
  53. $time = time() - $config['settlement_time'] * 24 * 60 * 60;
  54. Db::startTrans();
  55. try{
  56. // 正常收货后的情况
  57. $where1 = [
  58. ['dog.status', '=', DistributionOrderGoodsEnum::UN_RETURNED],
  59. ['o.order_status', '=', OrderEnum::STATUS_FINISH],
  60. // 确认收货时间 <= 当前时间 - 结算时间
  61. ['o.confirm_take_time', '<=', $time],
  62. ];
  63. // 未确认收货前,发生退款或取消订单的情况
  64. $where2 = [
  65. ['dog.status', '=', DistributionOrderGoodsEnum::UN_RETURNED],
  66. ['o.order_status', '=', OrderEnum::STATUS_CLOSE],
  67. ['o.confirm_take_time', 'exp', Db::raw('is null')],
  68. ];
  69. $field = 'dog.id,dog.user_id,dog.order_goods_id,dog.earnings,o.sn as order_sn';
  70. $lists = DistributionOrderGoods::alias('dog')
  71. ->leftJoin('order_goods og', 'og.id = dog.order_goods_id')
  72. ->leftJoin('order o', 'o.id = og.order_id')
  73. ->field($field)
  74. ->whereOr([$where1, $where2])
  75. ->select()
  76. ->toArray();
  77. foreach ($lists as $item) {
  78. // 判断当前分销订单是否允许结算
  79. if (!self::canSettle($item)) {
  80. continue;
  81. }
  82. // 增加用户收益
  83. self::incUserEarning($item);
  84. // 记录账户流水
  85. AccountLogLogic::add($item['user_id'],AccountLogEnum::BW_INC_DISTRIBUTION_SETTLE,AccountLogEnum::INC,$item['earnings'], $item['order_sn'],'分销订单');
  86. // 更新分销订单状态
  87. DistributionOrderGoods::update([
  88. 'id' => $item['id'],
  89. 'status' => DistributionOrderGoodsEnum::RETURNED,
  90. 'settlement_time' => time()
  91. ]);
  92. // 更新分销商等级
  93. DistributionLevelLogic::updateDistributionLevel($item['user_id']);
  94. // 消息通知
  95. event('Notice', [
  96. 'scene_id' => NoticeEnum::EARNINGS_NOTICE,
  97. 'params' => [
  98. 'user_id' => $item['user_id'],
  99. 'earnings' => $item['earnings']
  100. ]
  101. ]);
  102. }
  103. Db::commit();
  104. }catch(\Exception $e) {
  105. Db::rollback();
  106. Log::write('结算分销订单出错:'.$e->__toString());
  107. }
  108. }
  109. /**
  110. * @notes 判断分销订单是否需要结算
  111. * @param $item
  112. * @author Tab
  113. * @date 2021/7/28 11:40
  114. */
  115. public static function canSettle($item)
  116. {
  117. $orderId = OrderGoods::where('id', $item['order_goods_id'])->value('order_id');
  118. $afterSale = AfterSale::field('status')->where('order_id', $orderId)->select()->toArray();
  119. if (empty($afterSale)) {
  120. // 到了结算时间,订单无售后,可结算
  121. return true;
  122. }
  123. foreach($afterSale as $subItem) {
  124. // 订单处于售后中,暂不可结算
  125. if($subItem['status'] == AfterSaleEnum::STATUS_ING) {
  126. return false;
  127. }
  128. // 订单已售后成功,分销单置为失效状态,不可结算
  129. if($subItem['status'] == AfterSaleEnum::STATUS_SUCCESS) {
  130. self::invalid($item);
  131. return false;
  132. }
  133. }
  134. // 有售后但都是售后失败(即未产生退款),可结算
  135. return true;
  136. }
  137. /**
  138. * @notes 设置分销订单为已失效状态
  139. * @param $item
  140. * @author Tab
  141. * @date 2021/8/5 11:04
  142. */
  143. public static function invalid($item)
  144. {
  145. $distributionOrderGoods = DistributionOrderGoods::findOrEmpty($item['id']);
  146. $distributionOrderGoods->status = DistributionOrderGoodsEnum::EXPIRED;
  147. $distributionOrderGoods->settlement_time = time();
  148. $distributionOrderGoods->save();
  149. }
  150. /**
  151. * @notes 增加用户收益
  152. * @param $item
  153. * @author Tab
  154. * @date 2021/8/5 11:36
  155. */
  156. public function incUserEarning($item)
  157. {
  158. $user = User::findOrEmpty($item['user_id']);
  159. if (! $user->isEmpty()) {
  160. $user->user_earnings = is_null($user->user_earnings) ? 0 : $user->user_earnings;
  161. $user->user_earnings = $user->user_earnings + $item['earnings'];
  162. $user->save();
  163. }
  164. }
  165. }