| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251 |
- <?php
- namespace addons\RandFee\common\service;
- use addons\RandFee\common\enums\Order;
- use addons\RandFee\common\models\OrderModel;
- use common\enums\AddonsEnum;
- use common\models\order\OrderDetail;
- use common\models\user\User;
- use Exception;
- use Yii;
- use yii\base\Model;
- use yii\helpers\Json;
- class RandFeeService extends Model
- {
- /**
- * 商户ID
- *
- * @var integer
- */
- public $mall_id;
- /**
- * 满减
- *
- * @param array $params
- * [
- * 'mall_id' => mall_id
- * 'orders' => [order, order]
- * ]
- * @return void
- */
- public static function minus($params)
- {
- if (empty($params['mall_id'])) {
- return 0;
- // throw new Exception('mall-id 未设置');
- }
- $mall_id = $params['mall_id'];
- if (empty($params['orders'])) {
- return 0;
- // throw new Exception('orders 不存在');
- }
- $orders = $params['orders'];
- if (empty($params['user_id'])) {
- return 0;
- // throw new Exception('orders 不存在');
- }
- $user_id = $params['user_id'];
- // 获取设置
- $setting = (new SettingService(['mall_id' => $mall_id]))->getSetting();
- if (empty($setting)) {
- return 0;
- }
- // 减金额
- if (empty($condition = $setting['condition'])) {
- return 0;
- }
- // 判断会员等级
- $member = $setting['member'];
- if (!in_array(0, $member)) {
- $user = User::findOne(['id' => $user_id]);
- if (!in_array($user->level, $member)) {
- return 0;
- }
- }
- if (empty($setting['order'])) {
- return 0;
- }
- // 判断订单类型
- foreach ($orders as $k => $order) {
- // 未定义订单类型的不处理
- if (empty($order['order_type'])) {
- return 0;
- }
- // 订单类型为空时为普通订单
- // $orders[$k]['order_type'] = empty($order['order_type']) ? Order::DEFAULT : $order['order_type'];
- if (!in_array($orders[$k]['order_type'], $setting['order'])) {
- return 0;
- }
- }
- // 订单
- $total_price = 0;
- foreach ($orders as $order) {
- $total_price = bcadd($order['amount'], $total_price, 2);
- }
- // 获取随机减金额
- $min = 0;
- $max = 0;
- foreach ($condition as $val) {
- if ($total_price >= $val['total_price']) {
- $min = bcmul($val['rand_min'], 100, 2);
- $max = bcmul($val['rand_max'], 100, 2);
- }
- }
- if ($min == 0 && $max == 0) {
- return 0;
- }
- // 随机减金额
- $left = $rand_fee = bcdiv(mt_rand($min, $max), 100, 2);
- // 分配随机减金额
- $models = [];
- foreach ($orders as $order) {
- // 分配的金额
- $order_rand_fee = $rand_fee / ($total_price / $order['amount']);
- // 小于最小单位
- $order_rand_fee = $order_rand_fee < 0.01 ? 0.01 : $order_rand_fee;
- // 判断剩余为0时候 不使用最小单位
- $order_rand_fee = $left == 0 ? 0 : $order_rand_fee;
- $result = OrderModel::find()->where(['order_no'=>$order['order_no'],'user_id'=>$order['user_id'] ?? 0,'mall_id'=>$mall_id])->one();
- if(!empty($result)){
- $rand_fee = 0;
- $order_rand_fee = 0;
- continue;
- }
- // 创建订单
- ($model = new OrderModel())->load([
- 'mall_id' => $mall_id,
- 'order_id' => $order['order_id'] ?? 0,
- 'order_no' => $order['order_no'],
- 'user_id' => $user_id,
- 'rand_fee' => $order_rand_fee, // 订单随机减
- 'total_rand_fee' => $rand_fee, // 随机减
- 'order_type' => $order['order_type'],
- 'created_at' => time(),
- ], '');
- $res = $model->save();
- if ($res === false) throw new Exception('随机减订单生产失败');
- $models[] = $model;
- // 减少剩余的
- $left = bcsub($rand_fee, $order_rand_fee, 2);
- }
- return [$rand_fee, $models, [
- sprintf('%.2f', bcdiv($min, 100, 2)),
- sprintf('%.2f', bcdiv($max, 100, 2))
- ]];
- }
- /**
- * 获取订单
- *
- * @param array $params
- * @return array
- */
- public static function orderRandFee($params)
- {
- if (empty($params['order'])) {
- return $params['order'];
- }
- // 状态是未付款不返回金额
- if ($params['order']['pay_status'] == 0) {
- return $params['order'];
- }
- // 订单ID
- $order_id = $params['order']['id'];
- $rand_fee = OrderModel::find()->where(['order_id' => $order_id])->select('rand_fee')->orderBy('id desc')->scalar();
- if (empty($rand_fee)) {
- return $params['order'];
- }
- // 实际支付
- // $pay_money = bcsub($params['order']['pay_money'], $rand_fee, 2);
- $params['order']['rand_fee'] = $rand_fee;
- return $params['order'];
- }
- /**
- * 获取订单售后订单数据详情
- *
- * @param array $params
- * [
- * mall_id => ...
- * order_detail => ...
- * ]
- * @return void
- */
- public static function orderRefundSubmit($params)
- {
- if (empty($params['mall_id'])) {
- return [];
- }
- $mall_id = $params['mall_id'];
- if (empty($params['order_detail'])) {
- return [];
- }
- $order_detail = $params['order_detail'];
- // 订单ID
- $order_id = is_array($order_detail) ? $order_detail['order_id'] : $order_detail->order_id;
- // 查询随机减金额
- $rand_fee = OrderModel::find()->where(['order_id' => $order_id])->select('rand_fee')->orderBy('id desc')->scalar();
- if (empty($rand_fee)) {
- return [];
- }
- // 查询订单数量
- $orders = OrderDetail::find()
- ->where(['mall_id' => $mall_id, 'order_id' => $order_id])
- ->select('id, order_id, goods_price')
- ->orderBy('id asc')
- ->all();
- if (empty($orders)) {
- return [];
- }
- // 被扣减的随机减金额订单
- $refund_detail_id = 0;
- foreach ($orders as $order) {
- // 判断当前商品支付金额是否大于随机减金,大于则此商品作为随机减金额进行减扣
- if ($order->goods_price >= $rand_fee) $refund_detail_id = $order->id;
- }
- // 随机减扣除
- if ($refund_detail_id == $order_detail['id']) {
- // 扣去随机减的金额获得该订单可退款金额
- $goods_price = bcsub($order_detail['goods_price'], $rand_fee, 2);
- is_array($order_detail) ? $order_detail['goods_price'] = $goods_price : $order_detail->goods_price = $goods_price;
- }
- return $order_detail;
- }
- /**
- * 获取随机减金额
- * @Author: lun
- * @DateTime: 2023/2/21 0021 17:53
- * @Copyright: copyright (c) 2021 广东七件事集团
- * @param $payMoney
- * @param $orderNo
- * @return false|int|string
- */
- public static function getRandFee($payMoney, $orderNo)
- {
- $rand_fee = OrderModel::find()->where(['order_no' => $orderNo])->select('rand_fee')->orderBy('id desc')->scalar();
- if (empty($rand_fee)) {
- return $payMoney;
- }
- return $payMoney - $rand_fee;
- }
- }
|