multi-store/app/common/logic/PayNotifyLogic.php
2024-06-29 16:13:34 +08:00

1201 lines
46 KiB
PHP

<?php
namespace app\common\logic;
use app\api\logic\order\OrderLogic;
use app\common\enum\OrderEnum;
use app\common\enum\PayEnum;
use app\common\enum\user\UserShipEnum;
use app\common\enum\YesNoEnum;
use app\common\logic\user_product_storage\UserProductStorageLogic;
use app\common\model\Config;
use app\common\model\dict\DictType;
use app\common\model\finance\CapitalFlow;
use app\common\model\finance\PayNotifyLog;
use app\common\model\pay\PayNotify;
use app\common\model\store_branch_product\StoreBranchProduct;
use app\common\model\store_cash_finance_flow\StoreCashFinanceFlow;
use app\common\model\store_finance_flow\StoreFinanceFlow;
use app\common\model\store_order\StoreOrder;
use app\common\model\store_order_cart_info\StoreOrderCartInfo;
use app\common\model\store_product_log\StoreProductLog;
use app\common\model\system_store\SystemStore;
use app\common\model\user\User;
use app\common\model\user\UserAddress;
use app\common\model\user\UserRecharge;
use app\common\model\user_ship\UserShip;
use app\common\model\user_sign\UserSign;
use app\common\model\vip_flow\VipFlow;
use app\common\service\Curl;
use app\common\service\PushService;
use support\Log;
use think\facade\Db;
use Webman\RedisQueue\Redis;
/**
* 支付成功后处理订单状态
* Class PayNotifyLogic
* @package app\api\logic
*/
class PayNotifyLogic extends BaseLogic
{
public static function handle($action, $orderSn, $extra = [], $type = 'wechat')
{
Db::startTrans();
try {
self::$action($orderSn, $extra, $type);
Db::commit();
return true;
} catch (\Exception $e) {
Db::rollback();
Log::error('支付回调处理失败' . $e->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}";
}
}
}