getMessage() . ',lien:' . $e->getLine() . ',file:' . $e->getFile()); throw new \Exception($e->getMessage()); } } /** * 余额支付 * @param $orderSn * @param $extra * @return bool * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ public static function balancePay($orderSn, $extra = []) { $order = StoreOrder::where('order_id', $orderSn)->findOrEmpty(); $user = User::where('id', $order['uid'])->find(); if ($user['now_money'] < $order['pay_price']) { throw new \Exception('余额不足'); } // $order->money = $order['pay_price']; $order->paid = 1; $order->pay_time = time(); if (!$order->save()) { throw new \Exception('订单保存出错'); } if ($order['is_storage'] == 1) { $order->status = 2; UserProductStorageLogic::add($order); } // 减去余额 $user->now_money = bcsub($user['now_money'], $order['pay_price'], 2); $user->save(); if ($order['spread_uid'] > 0 && $user['user_ship'] == 1) { $oldUser = User::where('id', $order['spread_uid'])->value('purchase_funds'); if ($oldUser < $order['pay_price']) { $order['pay_price'] = $oldUser; } } // self::addUserSing($order); $capitalFlowDao = new CapitalFlowLogic($user); $capitalFlowDao->userExpense('user_order_balance_pay', 'order', $order['id'], $order['pay_price'], '', 0, $order['store_id']); self::dealProductLog($order); if ($order['shipping_type'] == 3) { //预留收银台余额支付得兑换券逻辑 if ($order->uid >0) { $total_vip = bcmul($order['pay_price'], 0.1, 2); self::addNewUserSing($order,8,$total_vip,1,1); User::where('id', $order->uid)->inc('integral', $total_vip)->update(); } // self::descStock($order['id']); } self::afterPay($order); if ($extra && $extra['store_id']) { $params = [ 'verify_code' => $order['verify_code'], 'store_id' => $extra['store_id'], 'staff_id' => $extra['staff_id'] ]; OrderLogic::writeOff($params); } return true; // Redis::send('push-platform-print', ['id' => $order['id']], 60); // PushService::push('store_merchant_' . $order['store_id'], $order['store_id'], ['type' => 'store_merchant', 'msg' => '您有一笔新的订单']); } /** * 礼品券支付 * @param $orderSn * @param $extra * @return void * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ public static function gift_pay($orderSn, $extra = []) { $order = StoreOrder::where('order_id', $orderSn)->findOrEmpty(); $user = User::where('id', $order['uid'])->find(); if ($user['integral'] < $order['pay_price']) { throw new \Exception('礼品券不足'); } $order->money = $order['pay_price']; $order->paid = 1; $order->pay_time = time(); if (!$order->save()) { throw new \Exception('订单保存出错'); } // 减去礼品券 $user->integral = bcsub($user['integral'], $order['pay_price'], 2); $user->save(); //入礼品券表扣款记录 $sing[] = [ 'uid' => $order['uid'], 'order_id' => $order['order_id'], // 'title' => '订单扣除兑换券', 'title' => 5, 'financial_pm' => 0, 'store_id' => $order['store_id'], 'number' => $order['pay_price'], 'type' => 1, 'user_ship' => $user['user_ship'], ]; (new UserSign())->saveAll($sing); if ($extra && $extra['store_id']) { $params = [ 'verify_code' => $order['verify_code'], 'store_id' => $extra['store_id'], 'staff_id' => $extra['staff_id'] ]; OrderLogic::lessWriteOff($params); } self::dealProductLog($order); } /** * 采购款支付 * @param $orderSn * @param $extra * @return void * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ public static function purchase_funds($orderSn, $extra = []) { $order = StoreOrder::where('order_id', $orderSn)->findOrEmpty(); $user = User::where('id', $order['uid'])->find(); if ($user['purchase_funds'] < $order['pay_price']) { throw new \Exception('采购款不足'); } $order->money = $order['pay_price']; $order->paid = 1; $order->pay_time = time(); if (!$order->save()) { throw new \Exception('订单保存出错'); } if ($order['is_storage'] == 1) { $order->status = 2; UserProductStorageLogic::add($order); } // 减去采购款 $user->purchase_funds = bcsub($user['purchase_funds'], $order['pay_price'], 2); $user->save(); $capitalFlowDao = new CapitalFlowLogic($user); $capitalFlowDao->userExpense('user_order_purchase_pay', 'order', $order['id'], $order['pay_price'], '', 1, $order['store_id']); // if ($user['user_ship'] == 1) { // self::dealVipAmount($order, PayEnum::PURCHASE_FUNDS); // } // self::addUserSing($order); self::afterPay($order); if ($extra && $extra['store_id']) { $params = [ 'verify_code' => $order['verify_code'], 'store_id' => $extra['store_id'], 'staff_id' => $extra['staff_id'] ]; OrderLogic::writeOff($params); } self::dealProductLog($order); // $count = UserSign::where([ // 'uid'=>$order['uid'], // 'type'=>1, // 'status'=>0 // ])->count(); // // if($count){ // self::addFlowLog($order); // } //收银台下单直接到账 // if($order['shipping_type'] == 3){ // self::descStock($order['id']); // } // Redis::send('push-platform-print', ['id' => $order['id']], 60); // PushService::push('store_merchant_' . $order['store_id'], $order['store_id'], ['type' => 'store_merchant', 'msg' => '您有一笔新的订单']); } //采购款支付后如果有对应的冻结的话就去反对应的log public static function addFlowLog($order) { //查询当前用户有无对应的充值的冻结金额 if ($order['uid'] > 0) { $query = UserSign::where([ 'uid' => $order['uid'], 'type' => 1, 'status' => 0 ]); // $query1 = clone $query; // $ids = $query->column('id'); $check = $query->sum('number'); // $count = $query1->count(); if ($check && $check > 0) { $backPurchase = bcmul($order['pay_price'], 0.1, 2); // if($count == 1){ //存在拆单子否 //少了就冻结减去这个对应的金额 $one = UserSign::where([ 'uid' => $order['uid'], 'type' => 1, 'status' => 0 ])->find(); $data = [ 'sid' => $one['id'], 'uid' => $order['uid'], 'order_id' => $order['order_id'], 'title' => '充值获得冻结兑换券', 'financial_pm' => 1, 'type' => 1, 'status' => 1, ]; if ($one['number'] >= $backPurchase) { // $wait = bcsub($one['number'],$backPurchase,2)??0; $data['number'] = $backPurchase; Db::name('user_sign_log')->insert($data); //总的减去采购款百分之十剩余的 // if(empty($wait)){ // UserSign::where('id',$one['id'])->update( // [ // 'number'=>0, // 'status'=>1 // ] // ); // }else{ // //add // UserSign::where('id',$one['id'])->update( // [ // 'number'=>$wait // ] // ); // } //并且加到对应的用户的采购款中 // User::where('id',$order['uid'])->inc('purchase_funds',$wait)->update(); } else { //对比采购款支付的多少 多了就拿冻结金额即可 $data['number'] = $one['number']; //都存到对应的log日志 Db::name('user_sign_log')->insert($data); // UserSign::where('id',$one['id'])->update( // [ // 'number'=>0, // 'status'=>1 // ] // ); //并且加到对应的用户的采购款中 // User::where('id',$order['uid'])->inc('purchase_funds',$wait)->update(); } } /* else{ //大于0的时候 //先处理金额大的再处理剩余的 //把所有的金额改为正的再加一条后再加 UserSign::where([ 'uid'=>$order['uid'], 'type'=>1, 'status'=>0 ])->update([ 'status'=>1, 'title'=>json_encode($ids) ]); if ($check >= $backPurchase) { //补一条待解冻的 $left = bcsub($check,$backPurchase,2); if($left > 0){ $data = [ 'uid' => $order['uid'], 'order_id' => $order['order_id'], 'title' => '补冻结兑换券', 'financial_pm' => 0, 'type' => 1, ]; $data['number'] =$check; $sid = Db::name('user_sign')->insertGetId($data); $data = [ 'uid' => $order['uid'], 'sid' => $sid, 'order_id' => $order['order_id'], 'title' => '充值获得冻结兑换券', 'financial_pm' => 1, 'type' => 1, ]; $data['number'] =$backPurchase; Db::name('user_sign_log')->insert($data); } // User::where('id',$order['uid'])->inc('purchase_funds',$backPurchase)->update();//add }else{ //log $data = [ 'uid' => $order['uid'], 'order_id' => $order['order_id'], 'title' => '充值获得冻结兑换券', 'financial_pm' => 1, 'type' => 1, ]; $data['number'] =$check; Db::name('user_sign_log')->insert($data); // User::where('id',$order['uid'])->inc('purchase_funds',$check)->update();//add } }*/ // } return true; } return true; } /** * @notes 微信通用回调 * @param $orderSn * @param array $extra * @date 2023/2/27 15:28 */ public static function wechat_common($orderSn, $extra = []) { $order = StoreOrder::where('order_id', $orderSn)->findOrEmpty(); if ($order->isEmpty() || $order->paid == PayEnum::ISPAID) { return true; } $order->status = 1; $order->paid = 1; $order->pay_time = time(); if ($order['is_storage'] == 1) { $order->status = 2; UserProductStorageLogic::add($order); } if ($order->pay_type != 10) { $order->pay_price = bcdiv($extra['amount']['payer_total'], 100, 2); } else { $extra['transaction_id'] = time(); } $user = User::where('id', $order['uid'])->find(); if ($order->pay_type == OrderEnum::CASHIER_ORDER_PAY || $order->pay_type == OrderEnum::CASHIER_ORDER_ALI_PAY) { //收银台支付 $order->status = 2; } else { $capitalFlowDao = new CapitalFlowLogic($user); //微信支付和用户余额无关 $capitalFlowDao->userExpense('user_order_pay', 'order', $order['id'], $order->pay_price, '', 1, $order['store_id']); } $order->save(); self::afterPay($order, $extra['transaction_id']); // self::addUserSing($order); self::dealProductLog($order); if ($order['shipping_type'] == 3) { self::descStock($order['id']); //直接加对应兑换券 if ($order->uid >0) { $total_vip = bcmul($order['pay_price'], 0.1, 2); self::addNewUserSing($order,8,$total_vip,1,1); User::where('id', $order->uid)->inc('integral', $total_vip)->update(); } } if (!empty($extra['payer']['openid']) && $order->pay_type == 7) { Redis::send('push-delivery', ['order_id' => $order['order_id'], 'openid' => $extra['payer']['openid']], 4); } return true; } //退款 public static function refund($orderSn, $extra = []) { //更新状态 $order = StoreOrder::where('order_id', $orderSn)->findOrEmpty(); if ($order->isEmpty() || $order->status == OrderEnum::REFUND_PAY) { //充值 $orderRe = UserRecharge::where('order_id', $orderSn)->findOrEmpty(); if ($orderRe->isEmpty() || $orderRe->status == -1) { return true; } $orderRe->status = -1; $orderRe->refund_price = $orderRe->price; $orderRe->refund_time = time(); $orderRe->remarks = ''; $orderRe->save(); $purchase_funds = User::where('id', $orderRe['uid'])->value('purchase_funds'); $user = User::where('id', $orderRe['uid'])->find(); $capitalFlowDao = new CapitalFlowLogic($user); if ($purchase_funds >= $orderRe['price']) { User::where('id', $orderRe['uid'])->dec('purchase_funds', $orderRe['refund_price'])->update(); $capitalFlowDao->userExpense('user_order_purchase_pay', 'order', $orderRe['id'], $orderRe['refund_price'], '', 1, $orderRe['store_id']); } else { User::where('id', $orderRe['uid'])->dec('purchase_funds', $purchase_funds)->update(); $capitalFlowDao->userExpense('user_order_purchase_pay', 'order', $orderRe['id'], $purchase_funds, '', 1, $orderRe['store_id']); } //退还 充值得兑换券 self::addNewUserSing($orderRe, 3, $orderRe->refund_price); //冻结 self::addNewUserSing($orderRe, 6, $orderRe->refund_price, 0, 1); //解冻 self::descUserSing($orderRe); // d($purchase_funds,$orderRe['refund_price'],$orderRe); return true; } $order->status = OrderEnum::REFUND_PAY; $order->refund_status = OrderEnum::REFUND_STATUS_FINISH; $order->refund_price = bcdiv($extra['amount']['refund'], 100, 2); $order->refund_reason_time = time(); $order->refund_num += 1; $order->save(); //日志记录 //加用户余额,采购款, 日志记录 加数量 $user = User::where('id', $order['uid'])->findOrEmpty(); $capitalFlowDao = new CapitalFlowLogic($user); $deal_money = bcdiv($extra['amount']['refund'], 100, 2); $check_user_sing = UserSign::where('order_id', $order['order_id'])->count(); if (in_array($order['pay_type'], [PayEnum::BALANCE_PAY, PayEnum::PURCHASE_FUNDS])) { if ($order['pay_type'] == PayEnum::BALANCE_PAY) { //用户余额支付 $user->now_money = bcadd($user->now_money, $deal_money, 2); $user->save(); //增加数量 self::addStock($order['id']); //退款 $capitalFlowDao->userIncome('system_balance_back', 'system_back', $order['id'], $deal_money); } if ($order['pay_type'] == PayEnum::PURCHASE_FUNDS) { //采购款支付 $user->purchase_funds = bcadd($user->purchase_funds, $deal_money, 2); $user->save(); //增加数量 self::addStock($order['id']); //退款 $capitalFlowDao->userIncome('system_purchase_back', 'system_back', $order['id'], $deal_money); } if ($check_user_sing) { //退还 兑换券 self::addNewUserSing($order, 3, $order->refund_price); //冻结 self::addNewUserSing($order, 6, $order->refund_price, 0, 1); //解冻 self::descUserSing($order); } return true; } //积分 if ($check_user_sing) { self::addNewUserSing($order, 3, $order->refund_price); //冻结 self::addNewUserSing($order, 6, $order->refund_price, 0, 1); //解冻 self::descUserSing($order); } //微信日志 user_order_refund $capitalFlowDao->userIncome('user_order_refund', 'system_back', $order['id'], $deal_money, '', 1); //处理财务流水退还 (new StoreFinanceFlowLogic())->store_finance_back($orderSn); self::addStock($order['id']); //微信 return true; // self::afterPay($order,$extra['transaction_id']); } //冻结券和礼品券得操作 /** * 处理冻结和解冻 礼品券得记录 * @param $order // 订单 * @param $category // 分类 * @param $number // 金额 * @param int $pm //收支 0支出 1获得 * @type $type //类型 0冻结 1解冻 * @return true */ public static function addNewUserSing($order, $category, $number, int $pm = 0, $type = 0) { $user_sing = new UserSign(); $sing = [ 'uid' => $order['uid'], 'order_id' => $order['order_id'], // 'title' => '购买商品获得兑换券', // 'title' => PayNotifyLogic::getTitle($category,$number), 'title' => $category, 'financial_pm' => $pm, 'store_id' => $order['store_id'], 'number' => $number, 'type' => $type, 'status' => 1, ]; $user_sing->save($sing); return true; } //退积分-->订单 public static function descUserSing($order) { // $user_sing = new UserSign(); if ($order['uid'] > 0) { $user_number = bcmul($order['refund_price'], '0.10', 2); // $sing = [ // 'uid' => $order['uid'], // 'order_id' => $order['order_id'], // 'title' => '退款扣除兑换券', // 'financial_pm' => 0, // 'store_id' => $order['store_id'], // 'number' => $user_number, // ]; // $user_sing->save($sing); // //删除之前获得的兑换券 // UserSign::where([ // 'order_id' => $order['order_id'], // 'financial_pm' => 1, // ])->update(['delete_time' => time()]); $now_int = User::where('id', $order['uid'])->withTrashed()->find(); if ($now_int) { if ($now_int['integral'] > $user_number) { User::where('id', $order['uid'])->withTrashed()->dec('integral', $user_number)->update(); } else { User::where('id', $order['uid'])->withTrashed()->dec('integral', $now_int['integral'])->update(); } } } return true; } /** * 现金退款相关 * @param $orderSn * @param $extra * @return true * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ public static function cash_refund($orderSn, $extra = []) { $order = StoreOrder::where('order_id', $orderSn)->findOrEmpty(); if ($order->isEmpty() || $order->status == OrderEnum::REFUND_PAY) { return true; } $order->refund_status = OrderEnum::REFUND_STATUS_FINISH; $order->refund_price = $order->pay_price; $order->refund_reason_time = time(); $order->refund_num += 1; $order->save(); //日志记录 $model = new StoreCashFinanceFlow(); $model->store_id = $order['store_id'] ?? 0; $model->cash_price = $order->pay_price; $model->receivable = $order->pay_price; $model->remark = '退款'; $model->type = 1; $model->status = YesNoEnum::YES; $model->save(); //增加数量 self::addStock($order['id']); return true; } /** * 充值现金退款相关 * @param $orderId * @param $extra * @return true */ public static function recharge_cash_refund($orderId, $extra = []) { $order = UserRecharge::where('id', $orderId)->findOrEmpty(); if ($order->isEmpty() || $order->status == -1) { return true; } $order->status = -1; $order->refund_price = $order->price; $order->refund_time = time(); $order->remarks = ''; $order->save(); return true; } //入冻结礼品券 public static function addUserSing($order) { $user_sing = new UserSign(); if ($order['uid'] > 0 && $order['total_price'] >= 500) { $user_number = bcmul($order['pay_price'], '0.10', 2); $sing = [ 'uid' => $order['uid'], 'order_id' => $order['order_id'], 'title' => '购买商品获得兑换券', 'financial_pm' => 1, 'store_id' => $order['store_id'], 'number' => $user_number, ]; $user_sing->save($sing); } return true; } public static function dealRechargeFrozen($order) { $total_vip = bcmul($order['price'], 0.1, 2); $user_sing = new UserSign(); //冻结 $sing[] = [ 'uid' => $order['uid'], 'order_id' => $order['order_id'], // 'title' => '充值获得冻结兑换券', // 'title' => self::getTitle(7,$total_vip), 'title' => 7, 'financial_pm' => 1, 'store_id' => $order['store_id'], // 'type' => 1, 'status' => 1, 'number' => $total_vip, 'back_num' => $total_vip, ]; //礼品券得 $sing[] = [ 'uid' => $order['uid'], 'order_id' => $order['order_id'], // 'title' => '充值获得冻结兑换券', // 'title' => self::getTitle(4,$total_vip), 'title' => 4, 'financial_pm' => 1, 'store_id' => $order['store_id'], 'type' => 1, 'status' => 1, 'number' => $total_vip, 'back_num' => $total_vip, ]; $user_sing->saveAll($sing); User::where('id', $order->uid)->inc('integral', $total_vip)->update(); return true; } /** * 充值 */ public static function recharge($orderSn, $extra = [], $type = 'wechat') { $order = UserRecharge::where('order_id', $orderSn)->findOrEmpty(); if ($order->isEmpty() || $order->paid == PayEnum::ISPAID) { return true; } if ($type == 'wechat') { $price = bcdiv($extra['amount']['payer_total'], 100, 2); } else { $price = $extra['buyer_pay_amount']; } $order->price = $price; $order->paid = 1; $order->pay_time = time(); $order->save(); $uid = $order->uid; $user = User::where('id', $uid)->findOrEmpty(); //用户的财务add $capitalFlowDao = new CapitalFlowLogic($user); $capitalFlowDao->userIncome('user_balance_recharge', 'user_recharge', $order['id'], $price, [], 1); if ($user->isEmpty()) { return true; } bcscale(2); // $user->now_money = bcadd($user->now_money, $price, 2);//v.1 $check = UserSign::where(['uid' => $order->uid, 'type' => 1])->count(); if (empty($check) && $user['user_ship'] == 0) { self::dealRechargeFrozen($order); } //更新等级 $user->user_ship = $order['user_ship']; $user->purchase_funds = bcadd($user->purchase_funds, $price, 2); $user->total_recharge_amount = bcadd($user->total_recharge_amount, $price, 2); $user->save(); if ($order['other_uid'] > 0) { $uid = $order['other_uid']; } PushService::push('wechat_mmp_' . $uid, $uid, ['type' => 'INDUSTRYMEMBERS', 'msg' => '订单支付成功', 'data' => ['id' => $order['id'], 'paid' => 1]]); PushService::push('store_merchant_' . $order['store_id'], $order['store_id'], ['type' => 'INDUSTRYMEMBERS', 'msg' => '订单支付成功', 'data' => ['id' => $order['id'], 'paid' => 1]]); if (!empty($extra['payer']['openid'])) { Redis::send('push-delivery', ['order_id' => $order['order_id'], 'openid' => $extra['payer']['openid'], 'logistics_type' => 3], 4); } return true; } /** * 现金支付 */ public static function cash_pay($orderSn) { $order = StoreOrder::where('order_id', $orderSn)->findOrEmpty(); if ($order->isEmpty() || $order->paid == PayEnum::ISPAID) { return true; } $order->paid = 1; $order->pay_time = time(); $order->status = 2; if (!$order->save()) { throw new \Exception('订单保存出错'); } self::afterPay($order); if ($order['is_storage'] == 1) { UserProductStorageLogic::add($order); } $cashFlowLogic = new CashFlowLogic(); $cashFlowLogic->insert($order['store_id'], $order['pay_price']); self::dealProductLog($order); if ($order['shipping_type'] == 3) { self::descStock($order['id']); //直接加到礼品券中 $user_sing = new UserSign(); $total_vip = bcmul($order['pay_price'], 0.1, 2); $sing[] = [ 'uid' => $order['uid'], 'order_id' => $order['order_id'], 'title' => 8, 'financial_pm' => 1, 'store_id' => $order['store_id'], 'type' => 1, 'status' => 1, 'number' => $total_vip, 'back_num' => $total_vip, ]; $user_sing->saveAll($sing); User::where('id', $order->uid)->inc('integral', $total_vip)->update(); } // Redis::send('push-platform-print', ['id' => $order['id']]); return true; } /** * @notes 阿里回调 * @param $orderSn * @param array $extra * @author 段誉 * @date 2023/2/27 15:28 */ public static function alipay_cashier($orderSn, $extra = []) { $order = StoreOrder::where('order_id', $orderSn)->findOrEmpty(); if ($order->isEmpty() || $order->paid == PayEnum::ISPAID) { return true; } if ($order->pay_type != 10) { $order->money = $extra['buyer_pay_amount']; $order->paid = 1; $order->pay_time = time(); $order->status = 1; $order->save(); } else { $extra['transaction_id'] = time(); } if ($order->pay_type == 9) { $order->status = 2; self::afterPay($order); UserProductStorageLogic::add($order); } self::dealProductLog($order); if ($order['shipping_type'] == 3) { self::descStock($order['id']); //直接加兑换券到对应得账户 if ($order->uid >0) { $total_vip = bcmul($order['pay_price'], 0.1, 2); self::addNewUserSing($order,8,$total_vip,1,1); User::where('id', $order->uid)->inc('integral', $total_vip)->update(); } } // if ($order->pay_type == 9) { // $extra['create_time'] = $order['create_time']; // PushService::push('store_merchant_' . $order['store_id'], $order['store_id'], ['type' => 'cash_register', 'msg' => '您有一笔订单已支付', 'data' => $extra]); // Redis::send('push-platform-print', ['id' => $order['id']]); // } // else { // PushService::push('store_merchant_' . $order['store_id'], $order['store_id'], ['type' => 'store_merchant', 'msg' => '您有一笔新的订单']); // } return true; } /** * 支付后逻辑 * @param $order * @return void */ public static function afterPay($order, $transaction_id = 0) { $financeLogic = new StoreFinanceFlowLogic(); $user_sing = new UserSign(); $off_activity = Config::where('name', 'off_activity')->value('value'); $village_uid = 0; $brigade_uid = 0; $user_ship = 0; if ($off_activity == 1) { //-----活动价结算更改 $financeLogic->order = $order; $financeLogic->user = ['uid' => $order['uid']]; $financeLogic->in($transaction_id, $order['pay_price'], OrderEnum::USER_ORDER_PAY, $order['store_id'], $order['staff_id'], 0, $order['pay_type']); //用户订单支付 $financeLogic->in($transaction_id, $order['pay_price'], OrderEnum::SUPPLIER_ORDER_OBTAINS, $order['store_id'], 0, 0, $order['pay_type']); $financeLogic->out($transaction_id, $order['pay_price'], OrderEnum::SUPPLIER_ORDER_OBTAINS, $order['store_id'], $order['staff_id'], 0, $order['pay_type']); $financeLogic->save(); $user_ship = User::where('id', $order['uid'])->value('user_ship'); //会员不加兑换券 if ( $order['uid'] > 0 && $order['total_price'] >= 500 && $order['pay_type'] != PayEnum::PURCHASE_FUNDS && $user_ship != 1 && $order['shipping_type'] !=3 ) { $user_number = bcmul($order['pay_price'], '0.10', 2); $sing = [ 'uid' => $order['uid'], 'order_id' => $order['order_id'], // 'title' => '购买商品获得兑换券', // 'title' => self::getTitle(1,$user_number), 'title' => 1, 'financial_pm' => 1, 'store_id' => $order['store_id'], 'number' => $user_number, 'status' => 0, ]; $user_sing->save($sing); } return false; } if ($order['uid'] > 0) { // 结算金额 要支付的钱减去冻结得钱去走后面得逻辑 发得兑换券也要去减去 //用户下单该用户等级为1得时候才处理冻结金额 $user = User::where('id', $order['uid'])->find(); $user_ship = $user['user_ship']; if($order['total_price'] >= 500 && $order['pay_type'] !=PayEnum::PURCHASE_FUNDS && $user_ship !=1 && $order['shipping_type'] !=3){ $user_number = bcmul($order['pay_price'], '0.10', 2); $sing = [ 'uid' => $order['uid'], 'order_id' => $order['order_id'], // 'title' => '购买商品获得兑换券', // 'title' => self::getTitle(1,$user_number), 'title' => 1, 'financial_pm' => 1, 'store_id' => $order['store_id'], 'number' => $user_number, 'status' => 0, ]; $user_sing->save($sing); } //纯在分销关系的时候要去判断分销出来的用户的采购款的额度 (只有会员按照这个逻辑拆分,其余的还是按照正常的支付金额) if ($user['user_ship'] == 1 && $order['pay_type'] != PayEnum::CASH_PAY) { $vipFrozenAmount = self::dealFrozenPrice($order['id']); //为1的时候要去减活动价 $order['pay_price'] = bcsub($order['pay_price'], $vipFrozenAmount, 2); self::dealVipAmount($order, $order['pay_type']); } } if ($order['spread_uid'] > 0 || $user_ship > 0) { if ($order['spread_uid'] > 0 && $user_ship == 0) { $user_ship = User::where('id', $order['spread_uid'])->value('user_ship'); if ($user_ship == 2) { $village_uid = $order['spread_uid']; $address = UserAddress::where(['uid' => $order['spread_uid'], 'is_default' => 1])->find(); if ($address) { $arr2 = UserAddress::where(['village' => $address['village'], 'brigade' => $address['brigade'], 'is_default' => 1])->column('uid'); if ($arr2) { $brigade_uid = User::where('id', 'in', $arr2)->where('user_ship', 3)->value('id') ?? 0; } } } elseif ($user_ship == 3) { $brigade_uid = $order['spread_uid']; $address = UserAddress::where(['uid' => $order['spread_uid'], 'is_default' => 1])->find(); if ($address) { $arr1 = UserAddress::where(['village' => $address['village'], 'is_default' => 1])->column('uid'); if ($arr1) { $village_uid = User::where('id', 'in', $arr1)->where('user_ship', 2)->value('id') ?? 0; } } } } else { //查询用户对应的村长和队长 $address = UserAddress::where(['uid' => $order['uid'], 'is_default' => 1])->find(); if ($address) { $arr1 = UserAddress::where(['village' => $address['village'], 'is_default' => 1])->column('uid'); if ($arr1) { $village_uid = User::where('id', 'in', $arr1)->where('user_ship', 2)->value('id') ?? 0; } $arr2 = UserAddress::where(['village' => $address['village'], 'brigade' => $address['brigade'], 'is_default' => 1])->column('uid'); if ($arr2) { $brigade_uid = User::where('id', 'in', $arr2)->where('user_ship', 3)->value('id') ?? 0; } } } switch ($user_ship) { case 1: // 行业会员 case 4: // 商户 CommissionLogic::setCook($order, $village_uid, $brigade_uid, $transaction_id); break; case 2: // 村长 CommissionLogic::setVillage($order, $village_uid, $brigade_uid, $transaction_id); break; case 3: // 队长 CommissionLogic::setBrigade($order, $village_uid, $brigade_uid, $transaction_id); break; default: CommissionLogic::setStore($order, $transaction_id); break; } } else { CommissionLogic::setStore($order, $transaction_id); } } /** * 回调日志 * @param $order * @param $extra * @return void */ public static function notifyLog($order, $extra) { $data = [ 'pay_type' => 'wechat', 'type' => OrderEnum::PAY, 'amount' => $extra['amount']['payer_total'], //分 'order_sn' => $order, 'out_trade_no' => $extra['transaction_id'], 'attach' => $extra['attach'], 'create_time' => date('Y-m-d H:i:s', time()), ]; PayNotify::create($data); } /** * 冻结金额 * @param $oid * @return int|mixed * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ public static function dealFrozenPrice($oid) { $detail = StoreOrderCartInfo::where('oid', $oid)->select()->toArray(); $total_vip = 0; foreach ($detail as $value) { $total_vip += $value['cart_info']['vip_frozen_price']; } return $total_vip; } /** * 处理用户为vip1时得冻结资金 * @param $order * @param $pay_type * @param $transaction_id * @return true * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ public static function dealVipAmount($order, $pay_type = 1, $transaction_id = 0) { $total_vip = self::dealFrozenPrice($order['id']); $data = [ 'order_id' => $order['id'], 'transaction_id' => $transaction_id ?? 0, 'order_sn' => $order['order_id'], 'user_id' => $order['uid'], 'number' => $total_vip, 'pay_type' => $pay_type ?? 1, 'status' => 0, 'store_id' => $order['store_id'], 'staff_id' => $order['staff_id'], 'create_time' => time() ]; Db::name('vip_flow')->insert($data); return true; } /** * 商品统计逻辑 * @param $order * @return true * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ public static function dealProductLog($order) { $store_id = $order['store_id']; $cart_id = $order['cart_id']; $uid = $order['uid']; if ($uid && $cart_id && $store_id) { $cart_id = explode(',', $cart_id); $productLog = StoreProductLog::where([ 'uid' => $uid ])->whereIn('cart_id', $cart_id) ->select()->toArray(); foreach ($productLog as &$value) { $value['pay_uid'] = $uid; $value['oid'] = $order['id']; $cart_info = StoreOrderCartInfo::where([ 'uid' => $uid, 'old_cart_id' => $value['cart_id'], 'store_id' => $store_id ])->find(); $value['order_num'] = $cart_info['cart_num'] ?? 1; $value['pay_num'] = $cart_info['cart_num'] ?? 1; $value['pay_price'] = $cart_info['price'] ?? 0; $value['cost_price'] = $cart_info['cart_info']['cost'] ?? 0; $value['update_time'] = time(); unset($value['create_time'], $value['delete_time']); } (new StoreProductLog())->saveAll($productLog); } return true; } public static function descSwap($oid) { $updateData = []; $goods_list = StoreOrderCartInfo::where('oid', $oid)->select()->toArray(); foreach ($goods_list as $v) { $StoreBranchProduct = StoreBranchProduct::where( [ 'store_id' => $v['store_id'], 'product_id' => $v['product_id'], ] )->withTrashed()->find(); $updateData[] = [ 'id' => $StoreBranchProduct['id'], 'swap' => $StoreBranchProduct['swap'] - $v['cart_num'], 'sales' => ['inc', $v['cart_num']] ]; } (new StoreBranchProduct())->saveAll($updateData); } /** * 扣库存 * @param $oid * @return void * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ public static function descStock($oid) { $updateData = []; $goods_list = StoreOrderCartInfo::where('oid', $oid)->select()->toArray(); foreach ($goods_list as $v) { $StoreBranchProduct = StoreBranchProduct::where( [ 'store_id' => $v['store_id'], 'product_id' => $v['product_id'], ] )->withTrashed()->find(); if ($StoreBranchProduct) { $updateData[] = [ 'id' => $StoreBranchProduct['id'], 'stock' => $StoreBranchProduct['stock'] - $v['cart_num'], 'sales' => ['inc', $v['cart_num']] ]; } } (new StoreBranchProduct())->saveAll($updateData); } /** * 加库存 * @param $oid * @return void * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ public static function addStock($oid) { $updateData = []; $goods_list = StoreOrderCartInfo::where('oid', $oid)->select()->toArray(); foreach ($goods_list as $v) { $StoreBranchProduct = StoreBranchProduct::where( [ 'store_id' => $v['store_id'], 'product_id' => $v['product_id'], ] )->withTrashed()->find(); if ($StoreBranchProduct) { $updateData[] = [ 'id' => $StoreBranchProduct['id'], 'stock' => $StoreBranchProduct['stock'] + $v['cart_num'], // 'sales' => ['inc', $v['cart_num']] // 'sales' => ['inc', $v['cart_num']] ]; } } (new StoreBranchProduct())->saveAll($updateData); } //礼品券相关对应文本 public static function getTitle($category, $amount) { switch ($category) { /**冻结券**/ //收入 case 1: return "购买商品{$amount}元获得冻结卷"; case 7: return "充值{$amount}元获得冻结卷"; //支出 case 2: return "核销商品{$amount}元解冻冻结卷"; case 3: return "退款{$amount}元扣除冻结卷"; /**礼品券**/ //收入 case 4: return "核销金额{$amount}元获得礼品卷"; //支出 case 5: return "兑换{$amount}元商品扣除礼品卷"; case 6: return "退款{$amount}元扣除礼品卷"; case 8: return "收银台支付{$amount}元增加礼品卷"; default: return "订单支付{$amount}元"; } } }