OrderSettlement.php 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. <?php
  2. /**
  3. * Niushop商城系统 - 团队十年电商经验汇集巨献!
  4. * =========================================================
  5. * Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
  6. * ----------------------------------------------
  7. * 官方网址: https://www.niushop.com
  8. * =========================================================
  9. */
  10. namespace addon\store\model\settlement;
  11. use app\model\BaseModel;
  12. use addon\store\model\Config;
  13. use addon\store\model\StoreAccount;
  14. use app\model\store\Store;
  15. class OrderSettlement extends BaseModel
  16. {
  17. /**
  18. * 门店订单分成计算
  19. * @param $data
  20. */
  21. public function orderSettlementAccount($data)
  22. {
  23. $order_id = $data[ 'order_id' ];
  24. $order_info = model('order')->getInfo([ [ 'order_id', '=', $order_id ] ]);
  25. if (empty($order_info)) return null;
  26. $store_id = $order_info[ 'store_id' ];
  27. $site_id = $order_info[ 'site_id' ];
  28. $config_model = new Config();
  29. $config = $config_model->getStoreWithdrawConfig($site_id)[ 'data' ][ 'value' ] ?? [];
  30. $is_settlement = $config[ 'is_settlement' ];//结算模式 todo 系统配置的门店计算开关是否会对门店结算开关造成影响
  31. if ($is_settlement > 0) {
  32. $store_model = new Store();
  33. $store_condition = array (
  34. [ 'site_id', '=', $site_id ],
  35. [ 'store_id', '=', $store_id ]
  36. );
  37. $store_info = $store_model->getStoreInfo($store_condition)[ 'data' ] ?? [];
  38. $is_settlement = $store_info[ 'is_settlement' ];
  39. if ($is_settlement > 0) {
  40. $store_settlement_rate = $store_info[ 'settlement_rate' ];
  41. if ($store_settlement_rate > 0) {
  42. $settlement_rate = $store_settlement_rate;
  43. } else {
  44. $settlement_rate = $config[ 'settlement_rate' ];
  45. }
  46. if ($settlement_rate > 0) {
  47. $settlement_rate_calc = $settlement_rate / 100;//计算门店抽成比例
  48. $order_money = $order_info[ 'order_money' ];
  49. //todo 可能还有退款
  50. $settlement_cost = $config[ 'settlement_cost' ];
  51. $settlement_cost_array = explode(',', $settlement_cost);
  52. $base_money = $order_money;
  53. $base_money -= $order_info[ 'refund_money' ] ?? 0;//todo 这儿涉及到一个问题,退款的金额里面包含一部分余额,可能结算金额不太一致
  54. $base_money = $base_money < 0 ? 0 : $base_money;
  55. if (in_array('balance', $settlement_cost_array)) {
  56. $balance_money = $order_info[ 'balance_money' ];
  57. $base_money -= $balance_money;
  58. }
  59. if (in_array('point', $settlement_cost_array)) {
  60. $point_money = $order_info[ 'point_money' ];
  61. $base_money += $point_money;
  62. }
  63. if (in_array('fenxiao_commission', $settlement_cost_array)) {
  64. $commission = $order_info[ 'commission' ];
  65. $base_money -= $commission;
  66. }
  67. //优惠券比较特殊, 不过不扣除要价格优惠券抵扣金额加回去
  68. if (!in_array('coupon', $settlement_cost_array)) {
  69. $coupon_money = $order_info[ 'coupon_money' ];
  70. $base_money += $coupon_money;
  71. }
  72. if ($base_money > 0) {
  73. $store_commission_rate = $settlement_rate;
  74. $store_commission = round($base_money * $settlement_rate_calc, 2);
  75. $order_data = array (
  76. 'store_commission_rate' => $store_commission_rate,
  77. 'store_commission' => $store_commission
  78. );
  79. $order_condition = array (
  80. [ 'order_id', '=', $order_id ]
  81. );
  82. model('order')->update($order_data, $order_condition);
  83. $store_account_model = new StoreAccount();
  84. //门店账户金额增加
  85. $store_account_data = array (
  86. 'account_data' => $store_commission,
  87. 'site_id' => $site_id,
  88. 'store_id' => $store_id,
  89. 'from_type' => 'order',
  90. 'remark' => '订单完成,门店抽成金额' . $store_commission,
  91. 'related_id' => $order_id
  92. );
  93. $store_account_model->addStoreAccount($store_account_data);
  94. }
  95. }
  96. }
  97. }
  98. }
  99. /**
  100. *
  101. * @param $data
  102. * @return void
  103. */
  104. public function orderRefundSettlementAccount($data)
  105. {
  106. $order_goods_id = $data[ 'order_goods_id' ];
  107. $order_goods_info = model('order_goods')->getInfo([ [ 'order_goods_id', '=', $order_goods_id ] ]);
  108. if (empty($order_goods_info))
  109. return null;
  110. $order_id = $order_goods_info[ 'order_id' ];
  111. $order_info = model('order')->getInfo([ [ 'order_id', '=', $order_id ] ]);
  112. if (empty($order_info))
  113. return null;
  114. $site_id = $order_info[ 'site_id' ];
  115. $store_id = $order_info[ 'store_id' ];
  116. $order_scene = $order_info[ 'order_scene' ];
  117. //只有收银台订单会有这种情况
  118. if ($store_id == 0 || $order_scene != 'cashier')
  119. return null;
  120. $refund_money = $order_goods_info[ 'refund_real_money' ];
  121. $order_money = $order_info[ 'order_money' ];
  122. $store_commission = $order_info[ 'store_commission' ];
  123. $refund_store_commission = round($store_commission * ( $refund_money / $order_money ), 2);
  124. $store_account_model = new StoreAccount();
  125. //门店账户金额增加
  126. $store_account_data = array (
  127. 'account_data' => -$refund_store_commission,
  128. 'site_id' => $site_id,
  129. 'store_id' => $store_id,
  130. 'from_type' => 'refund',
  131. 'remark' => '订单退款,门店抽成金额扣除' . $refund_store_commission,
  132. 'related_id' => $order_goods_id,
  133. 'is_limit' => 0
  134. );
  135. $store_account_model->addStoreAccount($store_account_data);
  136. }
  137. }