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 a1d5734..b71e7ba 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/app/Service/SeparateAccountsService.php b/app/Service/SeparateAccountsService.php index 3f89a5c..8cd5266 100644 --- a/app/Service/SeparateAccountsService.php +++ b/app/Service/SeparateAccountsService.php @@ -251,6 +251,7 @@ class SeparateAccountsService implements SeparateAccountsServiceInterface $order->id, FinancialRecord::OFL_FIRST_AWARD_LIMIT_AMOUNT ) + && $order->money >= FinancialRecord::OFL_FIRST_AWARD_LIMIT_AMOUNT ) { $awardAmount = SystemConfig::query()->where(['type' => 1, 'menu_name' => 'award_each_order'])->value('value'); 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');