// +---------------------------------------------------------------------- namespace App\Services\Common; use App\Models\AdvertModel; use App\Models\AdvertOrderModel; use App\Models\CapitalLogModel; use App\Models\MemberModel; use App\Services\Api\MemberPaymentService; use App\Services\BaseService; use App\Services\ConfigService; use App\Services\ChatMessageService; use App\Services\RedisService; /** * 用户广告订单-服务类 * Class AdvertOrderService * @package App\Services\Common */ class AdvertOrderService extends BaseService { // 静态对象 protected static $instance = null; /** * 构造函数 * @since 2020/11/10 * LoginService constructor. */ public function __construct() { $this->model = new AdvertOrderModel(); $this->advertModel = new AdvertModel(); $this->memberModel = new MemberModel(); $this->capitalModel = new CapitalLogModel(); } /** * 静态入口 * @return static|null */ public static function make() { if (!self::$instance) { self::$instance = (new static()); } return self::$instance; } /** * 订单列表 * @param $params * @param int $pageSize * @return array */ public function getDataList($params, $pageSize = 15) { $list = $this->model->from('advert_order as a') ->leftJoin('member as b', 'b.id', '=', 'a.business_id') ->leftJoin('member as c', 'c.id', '=', 'a.user_id') ->where(function ($query) use ($params) { $query->where(['a.mark' => 1])->where('a.status', '>', 0); $orderNo = isset($params['order_no']) && $params['order_no'] ? trim($params['order_no']) : ''; if ($orderNo) { $query->where('a.order_no', 'like', "%{$orderNo}%"); } $type = isset($params['type']) ? intval($params['type']) : 0; if ($type > 0) { $query->where(['a.type' => $type]); } $businessId = isset($params['business_id']) ? $params['business_id'] : 0; $userType = isset($params['user_type']) ? intval($params['user_type']) : 0; if ($userType > 0 && $businessId<=0) { $query->where(['c.user_type' => $userType]); } // 日期 $date = isset($params['date']) ? $params['date'] : []; $start = isset($date[0])? $date[0] : ''; $end = isset($date[1])? $date[1] : ''; $end = $start>=$end? '' : $end; if ($start) { $query->where('a.create_time','>=', strtotime($start)); } if($end){ $query->where('a.create_time','<', strtotime($end)); } $exceptionStatus = isset($params['exception_status']) ? intval($params['exception_status']) : 0; if ($exceptionStatus > 0) { $query->where(['a.exception_status' => $exceptionStatus]); } $status = isset($params['status']) ? intval($params['status']) : 0; if ($status > 0) { $query->where(['a.status' => $status]); } $userId = isset($params['user_id']) ? $params['user_id'] : 0; if ($userId > 0) { $query->where('a.user_id', $userId); } if ($businessId > 0) { $query->where('a.business_id', $businessId); } }) ->select(['a.*', 'b.username', 'c.username as c_username']) ->orderBy('a.create_time', 'desc') ->orderBy('a.id', 'desc') ->paginate($pageSize > 0 ? $pageSize : 9999999); $list = $list ? $list->toArray() : []; if ($list) { $payTypes = [1 => '银行卡', 2 => '微信', 3 => '支付宝', 4 => '其他']; $overTime = ConfigService::make()->getConfigByCode('trade_order_overtime'); $overTime = $overTime ? $overTime : 0; foreach ($list['data'] as &$item) { $item['idcardData'] = $item['idcard_data'] ? json_decode($item['idcard_data'], true) : []; $item['paymentData'] = $item['payment_data'] ? json_decode($item['payment_data'], true) : []; $item['create_time_text'] = $item['create_time'] ? datetime($item['create_time'], 'Y-m-d H:i:s') : ''; $item['update_time_text'] = $item['update_time'] ? datetime($item['update_time'], 'Y-m-d H:i:s') : ''; $item['time_text'] = $item['create_time'] ? datetime($item['create_time'], 'H:i') : ''; $item['utime_text'] = $item['update_time'] ? datetime($item['update_time'], 'H:i') : ''; $item['pay_time_text'] = $item['pay_time'] ? datetime($item['pay_time'], 'Y-m-d H:i') : ''; $item['username_text'] = $item['username'] ? format_account($item['username']) : ''; $item['c_username_text'] = $item['c_username'] ? format_account($item['c_username']) : ''; $item['exception_img'] = $item['exception_img'] ? get_image_url($item['exception_img']) : ''; $item['pay_img'] = $item['pay_img'] ? get_image_url($item['pay_img']) : ''; $item['paymentData']['qrcode'] = isset($item['paymentData']['qrcode']) && $item['paymentData']['qrcode'] ? get_image_url($item['paymentData']['qrcode']) : ''; $overTime = max(0, intval($item['create_time']) + $overTime * 60 - time()); $item['overtime_text'] = in_array($item['status'], [1, 2]) && $overTime ? date('H:i', $overTime) : ''; $payType = isset($item['pay_type']) ? $item['pay_type'] : 0; $item['pay_name'] = isset($payTypes[$payType]) ? $payTypes[$payType] : '其他'; $item['chat_key'] = getChatKey($item['user_id'],$item['business_id']); } } return [ 'pageSize' => $pageSize, 'total' => isset($list['total']) ? $list['total'] : 0, 'list' => isset($list['data']) ? $list['data'] : [] ]; } /** * 购买 * @param $userId * @param $params * @return false|int|number */ public function buy($userId, $params) { $id = isset($params['id']) ? intval($params['id']) : 0; $num = isset($params['num']) ? intval($params['num']) : 0; if ($id <= 0 || $num<=0) { $this->error = '1013'; return false; } // 验证参数 $config = \App\Services\ConfigService::make()->getConfigOptionByGroup(5); $tradeOpen = isset($config['trade_usdt_open']) ? $config['trade_usdt_open'] : 0; $tradePrice = isset($config['usdt_buy_price']) ? $config['usdt_buy_price'] : 0; $tradeLimitNum = isset($config['trade_no_catch']) ? $config['trade_no_catch'] : 0; // 是否开启交易 if ($tradeOpen != 1) { $this->error = '1013'; return false; } $info = AdvertService::make()->getInfo($id); $tradeType = isset($info['type'])? $info['type'] : 0; $priceType = isset($info['price_type'])? $info['price_type'] : 0; $price = isset($info['price'])? $info['price'] : 0; $businessId = isset($info['user_id'])? $info['user_id'] : 0; if(empty($info) || $info['status'] != 1 || $businessId<=0){ $this->error = '4001'; return false; } if($tradeType != 2){ $this->error = '4003'; return false; } if ($tradePrice <= 0 && $priceType == 2) { $this->error = '3002'; return false; } // 浮动价格计算 if ($priceType == 2) { $price = floatval($tradePrice + $price); } // 总价 $total = floatval($price * $num); if($total<=0){ $this->error = '4002'; return false; } // 单笔限额 if($total< $info['limit_min'] || $total> $info['limit_max']){ $this->error = lang('4005',['min'=> $info['limit_min'],'max'=>$info['limit_max']]); return false; } // 购买用户信息 $userInfo = MemberService::make()->getInfo($userId); $status = isset($userInfo['status']) ? $userInfo['status'] : 0; $idcardCheck = isset($userInfo['idcard_check']) ? $userInfo['idcard_check'] : 0; $username = isset($userInfo['username']) ? format_account($userInfo['username']) : ''; if (empty($userInfo) || $status != 1) { $this->error = '2009'; return false; } if($idcardCheck != 1){ $this->error = '2014'; return false; } // 未处理订单 $noCatchOrder = $this->checkOrderNoCatch($userId, 1); if ($tradeLimitNum > 0 && $noCatchOrder >= $tradeLimitNum) { $this->error = lang(3005, ['num' => $tradeLimitNum]); return false; } // 交易商家 $businessInfo = MemberService::make()->getInfo($businessId); if (empty($businessInfo)) { $this->error = '3004'; return false; } // 购买者身份信息 $idcardData = [ 'idcard' => isset($userInfo['idcard']) ? $userInfo['idcard'] : '', 'idcard_check' => isset($userInfo['idcard_check']) ? $userInfo['idcard_check'] : 0, 'idcard_front_img' => isset($userInfo['idcard_front_img']) ? $userInfo['idcard_front_img'] : '', 'idcard_back_img' => isset($userInfo['idcard_back_img']) ? $userInfo['idcard_back_img'] : '', 'idcard_hand_img' => isset($userInfo['idcard_hand_img']) ? $userInfo['idcard_hand_img'] : '', ]; // 收款方式 $payment = MemberPaymentService::make()->getPayment($businessInfo['id']); if (empty($payment)) { $this->error = '3015'; return false; } $this->model->startTrans(); $orderNo = get_order_num('TA'); $data = [ 'user_id' => $userId, 'business_id' => isset($businessInfo['id']) ? $businessInfo['id'] : 0, 'order_no' => $orderNo, 'type' => 1, 'pay_type' => isset($params['pay_type']) ? floatval($params['pay_type']) : 1, 'price' => $price, 'num' => $num, 'total' => $total, 'payment_id' => isset($payment['id']) ? intval($payment['id']) : 0, 'idcard_data' => $idcardData ? json_encode($idcardData, 256) : '', 'payment_data' => $payment ? json_encode($payment, 256) : '', 'create_time' => time(), 'update_time' => time(), 'status' => 1, 'mark' => 1, ]; if (!$order = $this->model->edit($data)) { $this->model->rollBack(); $this->error = '3023'; return false; } if(!$this->memberModel->where(['id'=> $businessInfo['id']])->decrement('usdt_num', $num)){ $this->model->rollBack(); $this->error = '3020'; return false; } $data = [ 'order_no'=> $orderNo, 'user_id'=> $businessInfo['id'], 'type'=> 2, 'pay_type'=> 1, 'trade_type'=> 2, 'change_type'=> 2, 'num'=> $num, 'total'=> $total, 'balance'=> floatval($businessInfo['usdt_num']-$num), 'create_time'=> time(), 'update_time'=> time(), 'status'=> 1, 'mark'=>1, 'remark'=> '交易员卖出', ]; if(!$this->capitalModel->edit($data)){ $this->model->rollBack(); $this->error = '3014'; return false; } // 订单通知 $data = [ 'from_uid' => $userId, 'to_uid' => $businessInfo['id'], 'type' => 3, 'order_no' => $orderNo, 'chat_key' => getChatKey($userId, $businessInfo['id']), 'message' => "您有来自客户购买广告订单:{$orderNo}的消息,请尽快回复!", 'message_type' => 1, 'data_type' => 2, 'create_time' => time(), 'update_time' => time(), 'status' => 1, 'mark' => 1, ]; if (!ChatMessageService::make()->pushMessage($data)) { $this->model->rollBack(); $this->error = '3031'; return false; } $this->model->commit(); return $order; } /** * 购买 * @param $userId * @param $params * @return false|int|number */ public function sell($userId, $params) { $id = isset($params['id']) ? intval($params['id']) : 0; $num = isset($params['num']) ? intval($params['num']) : 0; $paymentId = isset($params['payment_id']) ? intval($params['payment_id']) : 0; if ($id <= 0 || $num<=0 || $paymentId<=0) { $this->error = '1013'; return false; } // 验证参数 $config = \App\Services\ConfigService::make()->getConfigOptionByGroup(5); $tradeOpen = isset($config['trade_usdt_open']) ? $config['trade_usdt_open'] : 0; $tradePrice = isset($config['usdt_buy_price']) ? $config['usdt_sell_price'] : 0; $tradeLimitNum = isset($config['trade_no_catch']) ? $config['trade_no_catch'] : 0; // 是否开启交易 if ($tradeOpen != 1) { $this->error = '1013'; return false; } $info = AdvertService::make()->getInfo($id); $tradeType = isset($info['type'])? $info['type'] : 0; $priceType = isset($info['price_type'])? $info['price_type'] : 0; $price = isset($info['price'])? $info['price'] : 0; $businessId = isset($info['user_id'])? $info['user_id'] : 0; if(empty($info) || $info['status'] != 1){ $this->error = '4001'; return false; } if($tradeType != 1){ $this->error = '4004'; return false; } if ($tradePrice <= 0 && $priceType == 2) { $this->error = '3002'; return false; } // 验证数量或金额 if ($priceType == 2) { $price = floatval($tradePrice + $price); } // 单笔限额 $total = floatval($price * $num); if($total<=0){ $this->error = '4002'; return false; } if($total< $info['limit_min'] || $total> $info['limit_max']){ $this->error = lang('4005',['min'=> $info['limit_min'],'max'=>$info['limit_max']]); return false; } // 用户信息 $userInfo = MemberService::make()->getInfo($userId); $status = isset($userInfo['status']) ? $userInfo['status'] : 0; $idcardCheck = isset($userInfo['idcard_check']) ? $userInfo['idcard_check'] : 0; $username = isset($userInfo['username']) && $userInfo['username'] ? format_account($userInfo['username']) : ''; if ($status != 1) { $this->error = '2009'; return false; } if($idcardCheck != 1){ $this->error = '2014'; return false; } // 未处理订单 $noCatchOrder = $this->checkOrderNoCatch($userId, 2); if ($tradeLimitNum > 0 && $noCatchOrder >= $tradeLimitNum) { $this->error = lang(3005, ['num' => $tradeLimitNum]); return false; } // 交易商家 $businessInfo = MemberService::make()->getInfo($businessId); if (empty($businessInfo)) { $this->error = '3004'; return false; } // 购买者身份信息 $idcardData = [ 'idcard' => isset($userInfo['idcard']) ? $userInfo['idcard'] : '', 'idcard_check' => isset($userInfo['idcard_check']) ? $userInfo['idcard_check'] : 0, 'idcard_front_img' => isset($userInfo['idcard_front_img']) ? $userInfo['idcard_front_img'] : '', 'idcard_back_img' => isset($userInfo['idcard_back_img']) ? $userInfo['idcard_back_img'] : '', 'idcard_hand_img' => isset($userInfo['idcard_hand_img']) ? $userInfo['idcard_hand_img'] : '', ]; // 收款方式 $paymentInfo = MemberPaymentService::make()->getInfo($paymentId); if (empty($paymentInfo)) { $this->error = '3010'; return false; } $paymentData = [ 'payment_id' => $paymentInfo['id'], 'type' => $paymentInfo['type'], 'logo' => $paymentInfo['logo'] ? get_image_url($paymentInfo['logo']) : '', 'real_name' => $paymentInfo['real_name'], 'bank_name' => $paymentInfo['bank_name'], 'bank_card' => $paymentInfo['bank_card'], 'branch_name' => $paymentInfo['branch_name'], 'qrcode' => $paymentInfo['qrcode'] ? get_image_url($paymentInfo['qrcode']) : '', 'account' => $paymentInfo['account'], ]; $this->model->startTrans(); $orderNo = get_order_num('TA'); $data = [ 'user_id' => $userId, 'business_id' => isset($businessInfo['id']) ? $businessInfo['id'] : 0, 'order_no' => $orderNo, 'type' => 2, 'pay_type' => isset($params['pay_type']) ? floatval($params['pay_type']) : 1, 'price' => $price, 'num' => $num, 'total' => $total, 'payment_id' => $paymentId, 'idcard_data' => $idcardData ? json_encode($idcardData, 256) : '', 'payment_data' => $paymentData ? json_encode($paymentData, 256) : '', 'create_time' => time(), 'update_time' => time(), 'status' => 1, 'mark' => 1, ]; if (!$order = $this->model->edit($data)) { $this->model->rollBack(); $this->error = '3023'; return false; } // 扣除出售用户的USDT if(!$this->memberModel->where(['id'=> $userId])->decrement('usdt_num', $num)){ $this->model->rollBack(); $this->error = '3020'; return false; } $data = [ 'order_no'=> $orderNo, 'user_id'=> $userId, 'type'=> 2, 'pay_type'=> 1, 'trade_type'=> 2, 'change_type'=> 2, 'num'=> $num, 'total'=> $total, 'balance'=> floatval($userInfo['usdt_num']-$num), 'create_time'=> time(), 'update_time'=> time(), 'status'=> 1, 'mark'=>1, 'remark'=> '客户卖出', ]; if(!$this->capitalModel->edit($data)){ $this->model->rollBack(); $this->error = '3014'; return false; } // 订单通知 $data = [ 'from_uid' => $userId, 'to_uid' => $businessInfo['id'], 'type' => 3, 'order_no' => $orderNo, 'chat_key' => getChatKey($userId, $businessInfo['id']), 'message' => "您有来自客户出售广告订单:{$orderNo}的消息,请尽快回复!", 'message_type' => 1, 'data_type' => 3, 'create_time' => time(), 'update_time' => time(), 'status' => 1, 'mark' => 1, ]; if (!ChatMessageService::make()->pushMessage($data)) { $this->model->rollBack(); $this->error = '3031'; return false; } $this->model->commit(); return $order; } /** * 订单打款处理 * @param $userId 用户ID * @param $params 打款参数 * @return false */ public function pay($userId, $params) { $orderId = isset($params['id']) ? $params['id'] : 0; if ($orderId <= 0) { $this->error = '1013'; return false; } $orderInfo = $this->model->where(['user_id' => $userId, 'id' => $orderId, 'mark' => 1, 'type' => 1]) ->whereIn('status', [1, 2, 5, 7]) ->select(['id', 'order_no', 'business_id', 'type', 'payment_id', 'num', 'total', 'status']) ->first(); $tradeType = isset($orderInfo['type']) ? $orderInfo['type'] : 0; if (empty($orderInfo)) { $this->error = '3016'; return false; } if ($tradeType != 1) { $this->error = '3024'; return false; } // 用户信息 $userInfo = MemberService::make()->getInfo($userId); $status = isset($userInfo['status']) ? $userInfo['status'] : 0; if ($status != 1) { $this->error = '2009'; return false; } // 交易密码 $tradePassword = isset($params['trade_password']) ? trim($params['trade_password']) : ''; $password = isset($userInfo['trade_password']) ? trim($userInfo['trade_password']) : ''; if (empty($password)) { $this->error = '2015'; return false; } if (!$tradePassword || get_password($tradePassword . md5($tradePassword . 'otc')) != $password) { $this->error = '2016'; return false; } $data = [ 'status' => 3, 'pay_type' => $params['pay_type'], 'pay_img' => $params['pay_img'], 'pay_remark' => $params['pay_remark'], 'pay_time' => time(), ]; if (!$this->model->where(['user_id' => $userId, 'id' => $orderId, 'mark' => 1])->update($data)) { $this->error = '3018'; return false; } return true; } /** * 订单确认处理 * @param $userId 用户ID * @param $params 打款参数 * @return false */ public function collection($userId, $params) { $orderId = isset($params['id']) ? $params['id'] : 0; if ($orderId <= 0) { $this->error = '1013'; return false; } $orderInfo = $this->model->where(['user_id' => $userId, 'id' => $orderId, 'mark' => 1, 'type' => 2]) ->select(['id', 'user_id', 'order_no', 'business_id', 'payment_id', 'type', 'num', 'total', 'status']) ->first(); $businessId = isset($orderInfo['business_id']) ? $orderInfo['business_id'] : 0; $tradeType = isset($orderInfo['type']) ? $orderInfo['type'] : 0; if (empty($orderInfo) || empty($businessId)) { $this->error = '3016'; return false; } if ($orderInfo['status'] != 3) { $this->error = '3026'; return false; } if ($tradeType != 2) { $this->error = '3024'; return false; } $this->model->startTrans(); // 订单状态更新 if (!$this->model->where(['user_id' => $userId, 'id' => $orderId, 'mark' => 1])->update(['status' => 4, 'update_time' => time()])) { $this->model->rollBack(); $this->error = '3023'; return false; } // 交易处理 if ($orderInfo['num'] > 0) { $info = $this->memberModel->where(['id' => $businessId, 'status' => 1, 'mark' => 1])->select(['id', 'username','usdt_num', 'user_type'])->first(); if (empty($info)) { $this->model->rollBack(); $this->error = '3019'; return false; } // 商家进币 if (!$this->memberModel->where(['id' => $businessId, 'mark' => 1])->increment('usdt_num', $orderInfo['num'])) { $this->model->rollBack(); $this->error = '3019'; return false; } // 明细处理 $data = [ 'order_no' => $orderInfo['order_no'], 'user_id' => $businessId, 'type' => 1, 'trade_type' => 2, 'pay_type' => 1, 'change_type' => 1, 'num' => $orderInfo['num'], 'total' => $orderInfo['total'], 'balance' => floatval($info['usdt_num'] + $orderInfo['num']), 'create_time' => time(), 'remark' => '交易员购买广告', 'status' => 1, 'mark' => 1, ]; if (!$this->capitalModel->edit($data)) { $this->error = '3014'; $this->model->rollBack(); return false; } } $this->model->commit(); return true; } /** * 取消订单 * @param $userId * @param $params * @return false */ public function cancel($userId, $params) { $orderId = isset($params['id']) ? intval($params['id']) : 0; if ($orderId <= 0) { $this->error = '1013'; return false; } $orderInfo = $this->model->where(['user_id' => $userId, 'id' => $orderId, 'mark' => 1]) ->select(['id', 'order_no', 'business_id', 'type', 'num', 'total', 'status']) ->first(); $tradeType = isset($orderInfo['type']) ? $orderInfo['type'] : 0; $businessId = isset($orderInfo['business_id']) ? $orderInfo['business_id'] : 0; if (empty($orderInfo) || $businessId<=0) { $this->error = '3016'; return false; } if ($orderInfo['status'] == 3) { $this->error = '3027'; return false; } if ($orderInfo['status'] == 4) { $this->error = '3028'; return false; } if ($orderInfo['status'] == 7) { $this->error = '3030'; return false; } if (!in_array($orderInfo['status'], [1, 2])) { $this->error = '3029'; return false; } $this->model->startTrans(); // 订单状态更新 $updateData = ['status' => 8, 'update_time' => time(), 'exception_remark' => '客户取消']; if (!$this->model->where(['user_id' => $userId, 'id' => $orderId, 'mark' => 1])->update($updateData)) { $this->model->rollBack(); $this->error = '3023'; return false; } // 出售订单,USDT退回 if ($tradeType == 2 && $orderInfo['num']>0) { $info = $this->memberModel->where(['id' => $userId, 'status' => 1, 'mark' => 1])->select(['id', 'username', 'usdt_num', 'user_type'])->first(); if (empty($info)) { $this->model->rollBack(); $this->error = '3019'; return false; } // 退还币给客户 if (!$this->memberModel->where(['id' => $userId, 'mark' => 1])->increment('usdt_num', $orderInfo['num'])) { $this->model->rollBack(); $this->error = '3019'; return false; } // 明细处理 $data = [ 'order_no' => $orderInfo['order_no'], 'user_id' => $userId, 'type' => 3, 'trade_type' => 2, 'pay_type' => 1, 'change_type' => 1, 'num' => $orderInfo['num'], 'total' => $orderInfo['total'], 'balance' => floatval($info['usdt_num'] + $orderInfo['num']), 'create_time' => time(), 'update_time' => time(), 'remark' => '客户取消退还', 'status' => 1, 'mark' => 1, ]; if (!$this->capitalModel->edit($data)) { $this->error = '3014'; $this->model->rollBack(); return false; } } // 买入取消 else if($tradeType == 1 && $orderInfo['num']>0){ $info = $this->memberModel->where(['id' => $businessId, 'status' => 1, 'mark' => 1])->select(['id', 'username', 'usdt_num', 'user_type'])->first(); if (empty($info)) { $this->model->rollBack(); $this->error = '3019'; return false; } // 退还币给币商 if (!$this->memberModel->where(['id' => $businessId, 'mark' => 1])->increment('usdt_num', $orderInfo['num'])) { $this->model->rollBack(); $this->error = '3019'; return false; } // 明细处理 $data = [ 'order_no' => $orderInfo['order_no'], 'user_id' => $businessId, 'type' => 3, 'trade_type' => 2, 'pay_type' => 1, 'change_type' => 1, 'num' => $orderInfo['num'], 'total' => $orderInfo['total'], 'balance' => floatval($info['usdt_num'] + $orderInfo['num']), 'create_time' => time(), 'update_time' => time(), 'remark' => '客户取消退还', 'status' => 1, 'mark' => 1, ]; if (!$this->capitalModel->edit($data)) { $this->error = '3014'; $this->model->rollBack(); return false; } } $this->model->commit(); return true; } /** * 获取未支付或处理的订单数 * @param $userId * @param int $type * @return mixed */ public function checkOrderNoCatch($userId, $type = 1) { return $this->model->where(['user_id' => $userId, 'type' => $type, 'mark' => 1]) ->whereIn('status', [1, 2, 5, 7]) ->count('id'); } /** * 自动取消广告订单处理 * @return false */ public function catchInvalidOrder(){ $cacheKey = "caches:adverts:cancels:"; if(RedisService::get($cacheKey.'lock')){ return false; } RedisService::set($cacheKey.'lock', 1, rand(3, 5)); $overtime = ConfigService::make()->getConfigByCode('trade_order_overtime'); $cancelTime = ConfigService::make()->getConfigByCode('trade_order_cancel'); $catchNum = ConfigService::make()->getConfigByCode('trade_order_catch_num'); $catchNum = $catchNum > 0 ? $catchNum : 200; // 处理超时订单 if ($overtime > 0) { $this->model->where(['mark' => 1]) ->where('status', '<=', 2) ->where('create_time', '<=', time() - $overtime * 60) ->update(['status' => 7, 'catch_at' => time()]); } if ($cancelTime <= 0) { $this->error = '1023'; return false; } $fail = 0; $success = 0; $this->model->where(function ($query) use ($cancelTime) { // 已更新为超时的订单 $query->where(['mark' => 1, 'status' => 7]) ->where('catch_at', '<=', time() - $cancelTime * 60); }) ->orWhere(function ($query) use ($cancelTime, $overtime) { $query->where('mark', '=', 1) ->where('status', '<=', 2) ->where('create_time', '<=', time() - ($cancelTime + $overtime) * 60); }) ->select(['id', 'user_id', 'business_id','advert_id','order_no', 'type', 'num','total']) ->take($catchNum) ->get() ->each(function ($item, $k) use($cacheKey, &$fail, &$success){ // 客户卖出订单退还 $date = date('Y-m-d H:i:s'); $type = isset($item['type']) ? $item['type'] : 0; if ($type == 2) { if(!$this->orderReback($item['user_id'], $item)){ $fail++; RedisService::set($cacheKey."order_{$item['order_no']}:u{$item['user_id']}_fail", ['order'=> $item,'msg'=> lang($this->error),'date'=> $date], 3600); }else{ $success++; RedisService::set($cacheKey."order_{$item['order_no']}:u{$item['user_id']}_success", ['order'=> $item,'msg'=> lang($this->error),'date'=> $date], 3600); } } else{ if(!$this->orderReback($item['business_id'], $item)){ $fail++; RedisService::set($cacheKey."order_{$item['order_no']}:b{$item['business_id']}_fail", ['order'=> $item,'msg'=> lang($this->error),'date'=> $date], 3600); }else{ $success++; RedisService::set($cacheKey."order_{$item['order_no']}:b{$item['business_id']}_success", ['order'=> $item,'msg'=> lang($this->error),'date'=> $date], 3600); } } }); return ['success'=> $success,'fail'=> $fail]; } /** * 订单取消退还处理 * @param $userId * @param $orderInfo * @return bool */ protected function orderReback($userId, $orderInfo){ try { if($orderInfo['num']<=0){ return false; } $this->model->startTrans(); $updateData = ['status'=> 8, 'update_time'=> time(),'catch_at'=>time(),'exception_status'=> 0,'exception_remark'=>'系统取消']; if(!$this->model->where(['id'=> $orderInfo['id']])->update($updateData)){ $this->model->rollBack(); $this->error = '3043'; return false; } $info = $this->memberModel->where(['id' => $userId, 'status' => 1, 'mark' => 1])->select(['id', 'username', 'usdt_num', 'user_type'])->first(); if (empty($info)) { $this->model->rollBack(); $this->error = '3019'; return false; } // 退还币给客户 if (!$this->memberModel->where(['id' => $userId, 'mark' => 1])->increment('usdt_num', $orderInfo['num'])) { $this->model->rollBack(); $this->error = '3019'; return false; } // 明细处理 $data = [ 'order_no' => $orderInfo['order_no'], 'user_id' => $userId, 'type' => 3, 'pay_type' => 1, 'trade_type' => 2, 'change_type' => 1, 'num' => $orderInfo['num'], 'total' => $orderInfo['total'], 'balance' => floatval($info['usdt_num'] + $orderInfo['num']), 'create_time' => time(), 'update_time' => time(), 'remark' => '系统自动取消退还', 'status' => 1, 'mark' => 1, ]; if (!$this->capitalModel->edit($data)) { $this->error = '3014'; $this->model->rollBack(); return false; } $this->model->commit(); $this->error = '3044'; return true; } catch (\Exception $exception){ $this->error = $exception->getMessage(); return false; } } }