RandFeeService.php 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. <?php
  2. namespace addons\RandFee\common\service;
  3. use addons\RandFee\common\enums\Order;
  4. use addons\RandFee\common\models\OrderModel;
  5. use common\enums\AddonsEnum;
  6. use common\models\order\OrderDetail;
  7. use common\models\user\User;
  8. use Exception;
  9. use Yii;
  10. use yii\base\Model;
  11. use yii\helpers\Json;
  12. class RandFeeService extends Model
  13. {
  14. /**
  15. * 商户ID
  16. *
  17. * @var integer
  18. */
  19. public $mall_id;
  20. /**
  21. * 满减
  22. *
  23. * @param array $params
  24. * [
  25. * 'mall_id' => mall_id
  26. * 'orders' => [order, order]
  27. * ]
  28. * @return void
  29. */
  30. public static function minus($params)
  31. {
  32. if (empty($params['mall_id'])) {
  33. return 0;
  34. // throw new Exception('mall-id 未设置');
  35. }
  36. $mall_id = $params['mall_id'];
  37. if (empty($params['orders'])) {
  38. return 0;
  39. // throw new Exception('orders 不存在');
  40. }
  41. $orders = $params['orders'];
  42. if (empty($params['user_id'])) {
  43. return 0;
  44. // throw new Exception('orders 不存在');
  45. }
  46. $user_id = $params['user_id'];
  47. // 获取设置
  48. $setting = (new SettingService(['mall_id' => $mall_id]))->getSetting();
  49. if (empty($setting)) {
  50. return 0;
  51. }
  52. // 减金额
  53. if (empty($condition = $setting['condition'])) {
  54. return 0;
  55. }
  56. // 判断会员等级
  57. $member = $setting['member'];
  58. if (!in_array(0, $member)) {
  59. $user = User::findOne(['id' => $user_id]);
  60. if (!in_array($user->level, $member)) {
  61. return 0;
  62. }
  63. }
  64. if (empty($setting['order'])) {
  65. return 0;
  66. }
  67. // 判断订单类型
  68. foreach ($orders as $k => $order) {
  69. // 未定义订单类型的不处理
  70. if (empty($order['order_type'])) {
  71. return 0;
  72. }
  73. // 订单类型为空时为普通订单
  74. // $orders[$k]['order_type'] = empty($order['order_type']) ? Order::DEFAULT : $order['order_type'];
  75. if (!in_array($orders[$k]['order_type'], $setting['order'])) {
  76. return 0;
  77. }
  78. }
  79. // 订单
  80. $total_price = 0;
  81. foreach ($orders as $order) {
  82. $total_price = bcadd($order['amount'], $total_price, 2);
  83. }
  84. // 获取随机减金额
  85. $min = 0;
  86. $max = 0;
  87. foreach ($condition as $val) {
  88. if ($total_price >= $val['total_price']) {
  89. $min = bcmul($val['rand_min'], 100, 2);
  90. $max = bcmul($val['rand_max'], 100, 2);
  91. }
  92. }
  93. if ($min == 0 && $max == 0) {
  94. return 0;
  95. }
  96. // 随机减金额
  97. $left = $rand_fee = bcdiv(mt_rand($min, $max), 100, 2);
  98. // 分配随机减金额
  99. $models = [];
  100. foreach ($orders as $order) {
  101. // 分配的金额
  102. $order_rand_fee = $rand_fee / ($total_price / $order['amount']);
  103. // 小于最小单位
  104. $order_rand_fee = $order_rand_fee < 0.01 ? 0.01 : $order_rand_fee;
  105. // 判断剩余为0时候 不使用最小单位
  106. $order_rand_fee = $left == 0 ? 0 : $order_rand_fee;
  107. $result = OrderModel::find()->where(['order_no'=>$order['order_no'],'user_id'=>$order['user_id'] ?? 0,'mall_id'=>$mall_id])->one();
  108. if(!empty($result)){
  109. $rand_fee = 0;
  110. $order_rand_fee = 0;
  111. continue;
  112. }
  113. // 创建订单
  114. ($model = new OrderModel())->load([
  115. 'mall_id' => $mall_id,
  116. 'order_id' => $order['order_id'] ?? 0,
  117. 'order_no' => $order['order_no'],
  118. 'user_id' => $user_id,
  119. 'rand_fee' => $order_rand_fee, // 订单随机减
  120. 'total_rand_fee' => $rand_fee, // 随机减
  121. 'order_type' => $order['order_type'],
  122. 'created_at' => time(),
  123. ], '');
  124. $res = $model->save();
  125. if ($res === false) throw new Exception('随机减订单生产失败');
  126. $models[] = $model;
  127. // 减少剩余的
  128. $left = bcsub($rand_fee, $order_rand_fee, 2);
  129. }
  130. return [$rand_fee, $models, [
  131. sprintf('%.2f', bcdiv($min, 100, 2)),
  132. sprintf('%.2f', bcdiv($max, 100, 2))
  133. ]];
  134. }
  135. /**
  136. * 获取订单
  137. *
  138. * @param array $params
  139. * @return array
  140. */
  141. public static function orderRandFee($params)
  142. {
  143. if (empty($params['order'])) {
  144. return $params['order'];
  145. }
  146. // 状态是未付款不返回金额
  147. if ($params['order']['pay_status'] == 0) {
  148. return $params['order'];
  149. }
  150. // 订单ID
  151. $order_id = $params['order']['id'];
  152. $rand_fee = OrderModel::find()->where(['order_id' => $order_id])->select('rand_fee')->orderBy('id desc')->scalar();
  153. if (empty($rand_fee)) {
  154. return $params['order'];
  155. }
  156. // 实际支付
  157. // $pay_money = bcsub($params['order']['pay_money'], $rand_fee, 2);
  158. $params['order']['rand_fee'] = $rand_fee;
  159. return $params['order'];
  160. }
  161. /**
  162. * 获取订单售后订单数据详情
  163. *
  164. * @param array $params
  165. * [
  166. * mall_id => ...
  167. * order_detail => ...
  168. * ]
  169. * @return void
  170. */
  171. public static function orderRefundSubmit($params)
  172. {
  173. if (empty($params['mall_id'])) {
  174. return [];
  175. }
  176. $mall_id = $params['mall_id'];
  177. if (empty($params['order_detail'])) {
  178. return [];
  179. }
  180. $order_detail = $params['order_detail'];
  181. // 订单ID
  182. $order_id = is_array($order_detail) ? $order_detail['order_id'] : $order_detail->order_id;
  183. // 查询随机减金额
  184. $rand_fee = OrderModel::find()->where(['order_id' => $order_id])->select('rand_fee')->orderBy('id desc')->scalar();
  185. if (empty($rand_fee)) {
  186. return [];
  187. }
  188. // 查询订单数量
  189. $orders = OrderDetail::find()
  190. ->where(['mall_id' => $mall_id, 'order_id' => $order_id])
  191. ->select('id, order_id, goods_price')
  192. ->orderBy('id asc')
  193. ->all();
  194. if (empty($orders)) {
  195. return [];
  196. }
  197. // 被扣减的随机减金额订单
  198. $refund_detail_id = 0;
  199. foreach ($orders as $order) {
  200. // 判断当前商品支付金额是否大于随机减金,大于则此商品作为随机减金额进行减扣
  201. if ($order->goods_price >= $rand_fee) $refund_detail_id = $order->id;
  202. }
  203. // 随机减扣除
  204. if ($refund_detail_id == $order_detail['id']) {
  205. // 扣去随机减的金额获得该订单可退款金额
  206. $goods_price = bcsub($order_detail['goods_price'], $rand_fee, 2);
  207. is_array($order_detail) ? $order_detail['goods_price'] = $goods_price : $order_detail->goods_price = $goods_price;
  208. }
  209. return $order_detail;
  210. }
  211. /**
  212. * 获取随机减金额
  213. * @Author: lun
  214. * @DateTime: 2023/2/21 0021 17:53
  215. * @Copyright: copyright (c) 2021 广东七件事集团
  216. * @param $payMoney
  217. * @param $orderNo
  218. * @return false|int|string
  219. */
  220. public static function getRandFee($payMoney, $orderNo)
  221. {
  222. $rand_fee = OrderModel::find()->where(['order_no' => $orderNo])->select('rand_fee')->orderBy('id desc')->scalar();
  223. if (empty($rand_fee)) {
  224. return $payMoney;
  225. }
  226. return $payMoney - $rand_fee;
  227. }
  228. }