From 4d9870e8013fa3a77b7d1f071fe95e13d833cea0 Mon Sep 17 00:00:00 2001 From: weigang Date: Wed, 26 Aug 2020 16:50:00 +0800 Subject: [PATCH] =?UTF-8?q?=E6=88=91=E7=9A=84=E8=AE=A2=E5=8D=95/=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E8=87=AA=E5=8A=A8=E5=8F=96=E6=B6=88/=E7=A4=BE?= =?UTF-8?q?=E5=8C=BA=E6=9C=8D=E5=8A=A1=E7=82=B9=E4=BD=99=E9=A2=9D=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Constants/LogLabel.php | 2 + app/Controller/OrderController.php | 15 +++++ app/Model/Market.php | 30 ++++++++++ app/Model/OrderMain.php | 3 + app/Request/UserOrdersRequest.php | 39 +++++++++++++ app/Service/FinancialRecordService.php | 6 +- app/Service/OrderService.php | 80 ++++++++++++++++++++++++++ app/Service/OrderServiceInterface.php | 17 ++++++ config/routes.php | 1 + 9 files changed, 190 insertions(+), 3 deletions(-) create mode 100644 app/Model/Market.php create mode 100644 app/Request/UserOrdersRequest.php diff --git a/app/Constants/LogLabel.php b/app/Constants/LogLabel.php index 8807da4..e4c5a30 100644 --- a/app/Constants/LogLabel.php +++ b/app/Constants/LogLabel.php @@ -59,4 +59,6 @@ class LogLabel extends AbstractConstants */ const PAY_NOTIFY_REFUND = 'notify_refund'; + const AUTO_CANCEL_USER_ORDER = 'auto_cancel_user_order_log'; + } diff --git a/app/Controller/OrderController.php b/app/Controller/OrderController.php index 0d019f5..df60d53 100644 --- a/app/Controller/OrderController.php +++ b/app/Controller/OrderController.php @@ -7,6 +7,7 @@ use App\Constants\LogLabel; use App\Model\OrderMain; use App\Request\OrderOfflineRequest; use App\Request\OrderOnlineRequest; +use App\Request\UserOrdersRequest; use App\Service\SeparateAccountsServiceInterface; use Hyperf\DbConnection\Db; use Hyperf\Di\Annotation\Inject; @@ -109,4 +110,18 @@ class OrderController extends BaseController return $this->success($this->orderService->onlineCancel($orderMain->global_order_id)); } + /** + * 用户订单 + * @param UserOrdersRequest $request + * @return \Psr\Http\Message\ResponseInterface + */ + public function userOnlineOrders(UserOrdersRequest $request) + { + $params = $request->validated(); + $this->orderService->onlineAutoCancelByUserId($params['user_id']); + $result = $this->orderService->userOnlineOrders($params['user_id'], $params['state'], $params['page'], $params['pagesize']); + + return $this->success($result); + } + } \ No newline at end of file diff --git a/app/Model/Market.php b/app/Model/Market.php new file mode 100644 index 0000000..4d1a2d0 --- /dev/null +++ b/app/Model/Market.php @@ -0,0 +1,30 @@ + 'required|nonempty|integer', + 'market_id' => 'required|nonempty|integer', + 'state' => 'required|integer', + 'page' => 'required|nonempty|integer', + 'pagesize' => 'required|nonempty|integer', + ]; + } + + public function messages(): array + { + return [ + '*.*' => ':attribute 参数不正确', + ]; + } +} diff --git a/app/Service/FinancialRecordService.php b/app/Service/FinancialRecordService.php index fe6a452..4fbfbee 100644 --- a/app/Service/FinancialRecordService.php +++ b/app/Service/FinancialRecordService.php @@ -75,7 +75,7 @@ class FinancialRecordService implements FinancialRecordServiceInterface 'user_type' => UserBalance::USER_TYPE_CS, 'source_id' => $user_id ]); - $balance->balance = bcadd($balance->balance, $money); + $balance->balance = bcadd($balance->balance, $money, 2); $balance->save(); } @@ -99,7 +99,7 @@ class FinancialRecordService implements FinancialRecordServiceInterface 'user_type' => UserBalance::USER_TYPE_CS, 'source_id' => $user_id ]); - $balance->balance = bcadd($balance->balance, $money); + $balance->balance = bcadd($balance->balance, $money, 2); $balance->save(); } @@ -123,7 +123,7 @@ class FinancialRecordService implements FinancialRecordServiceInterface 'user_type' => UserBalance::USER_TYPE_CS, 'source_id' => $user_id ]); - $balance->balance = bcadd($balance->balance, $money); + $balance->balance = bcadd($balance->balance, $money,2); $balance->save(); } diff --git a/app/Service/OrderService.php b/app/Service/OrderService.php index fc3c3e0..109cb1f 100644 --- a/app/Service/OrderService.php +++ b/app/Service/OrderService.php @@ -8,6 +8,7 @@ use App\Model\Coupon; use App\Model\CouponRec; use App\Model\CouponUserUse; use App\Model\Goods; +use App\Model\Market; use App\Model\Order; use App\Model\OrderGoods; use App\Model\OrderMain; @@ -857,4 +858,83 @@ class OrderService implements OrderServiceInterface $ssdb = ApplicationContext::getContainer()->get(SSDBTask::class); return $ssdb->exec('del', SsdbKeysPrefix::PURCHASE_RECORD. date('Ymd') .'_'.$userId, $goodId); } + + /** + * @inheritDoc + */ + public function onlineAutoCancelByUserId($user_id) + { + Db::beginTransaction(); + try { + + $orders = OrderMain::query() + ->select(['id', 'global_order_id']) + ->where([ + 'user_id' => $user_id, + 'state' => OrderMain::ORDER_STATE_UNPAY + ]) + ->where('time_add', '<', (time()-900)) + ->get()->toArray(); + + foreach ($orders as $key => &$item) { + $order = OrderMain::query()->find($item['id']); + $order->state = OrderMain::ORDER_STATE_CANCEL; + $order->save(); + + $this->couponService->orderRefundCoupons($item['global_order_id']); + } + + Db::commit(); + return true; + } catch (Exception $e) { + + $this->log->event(LogLabel::AUTO_CANCEL_USER_ORDER, ['exception' => $e->getMessage()]); + Db::rollBack(); + return false; + } + + } + + /** + * @inheritDoc + */ + public function userOnlineOrders($user_id, $state, $page=1, $pagesize=10) + { + $builder = OrderMain::query() + ->where(['user_id' => $user_id, 'del' => OrderMain::ORDER_DEL_NO, 'type' => OrderMain::ORDER_TYPE_ONLINE]); + if ($state != 0) { + $state = explode(',', $state); + $builder = $builder->whereIn('state', $state); + } + $orders = $builder->get()->forPage($page, $pagesize)->toArray(); + + foreach ($orders as $key => &$order) { + // 市场名称 + $order['market_name'] = Market::query()->where(['id' => $order['market_id']])->value('name'); + + // 商品数量和第一个商品名、图 + $orderChildIds = Order::query()->select(['id'])->where(['order_main_id' => $order['id']])->get()->toArray(); + $orderChildIds = array_values(array_column($orderChildIds, 'id')); + $order['g_num'] = OrderGoods::query()->whereIn('order_id', $orderChildIds)->count(); + $goods = OrderGoods::query()->whereIn('order_id', $orderChildIds)->select(['name', 'img'])->first(); + $order['good_name'] = $goods->name; + // TODO 临时写死oss压缩类型 + $order['img'] = $this->switchImgToAliOss($goods->img); + } + + return $orders; + } + + public function switchImgToAliOss($path, $bucket = 'thumbnail_q50') + { + if (strpos($path, 'http') === false || strpos($path, 'https') === false) { + $path = 'https://img.lanzulive.com/' . $path; + } else { + $temp = explode('//', $path); + $temp = explode('/', $temp[1]); + unset($temp[0]); + $path = 'https://img.lanzulive.com/' . implode('/', $temp); + } + return $path . '!' . $bucket; + } } \ No newline at end of file diff --git a/app/Service/OrderServiceInterface.php b/app/Service/OrderServiceInterface.php index a371378..87990eb 100644 --- a/app/Service/OrderServiceInterface.php +++ b/app/Service/OrderServiceInterface.php @@ -72,4 +72,21 @@ interface OrderServiceInterface * 删除特价商品缓存 */ public function clearTodayGoodPurchase($userId, $goodId); + + /** + * 自动取消订单 + * 用户待付款订单超时15分钟未付款 + * @param $user_id + */ + public function onlineAutoCancelByUserId($user_id); + + /** + * 用户订单 + * @param $user_id + * @param $state + * @param int $page + * @param int $pagesize + * @return mixed + */ + public function userOnlineOrders($user_id, $state, $page=1, $pagesize=10); } \ No newline at end of file diff --git a/config/routes.php b/config/routes.php index 2a208a7..6a3dc03 100644 --- a/config/routes.php +++ b/config/routes.php @@ -52,6 +52,7 @@ Router::addGroup('/v1/',function (){ Router::post('Order/addOffline', 'App\Controller\OrderController@addOfflineOrder'); Router::post('Order/onlineCancel', 'App\Controller\OrderController@onlineCancel'); Router::post('Order/userComp', 'App\Controller\OrderController@userComp'); + Router::post('Order/userOnlineOrders', 'App\Controller\OrderController@userOnlineOrders'); //小程序支付相关 Router::post('wxminipay/online', 'App\Controller\PaymentController@wxminiPayOnline');