From c67d617fe67984f87270190027f6c00f2e447c7c Mon Sep 17 00:00:00 2001 From: luofei <604446095@qq.com> Date: Wed, 28 Jun 2023 15:26:01 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E8=AF=95=E4=BF=A1=E7=94=A8=E8=B4=AD?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=E7=BB=93=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../model/store/order/StoreGroupOrder.php | 6 ++ .../model/store/order/StoreOrderInterest.php | 12 +++ .../order/StoreOrderInterestRepository.php | 10 +++ .../store/order/StoreOrderRepository.php | 66 +++++++++++++++ app/controller/api/store/order/StoreOrder.php | 18 ++++ crmeb/services/payTool/Balance.php | 82 +++++++++++++++++++ crmeb/services/payTool/PayTool.php | 9 +- route/api.php | 1 + 8 files changed, 197 insertions(+), 7 deletions(-) create mode 100644 crmeb/services/payTool/Balance.php diff --git a/app/common/model/store/order/StoreGroupOrder.php b/app/common/model/store/order/StoreGroupOrder.php index 9357eaed..8c6b7cf4 100644 --- a/app/common/model/store/order/StoreGroupOrder.php +++ b/app/common/model/store/order/StoreGroupOrder.php @@ -110,4 +110,10 @@ class StoreGroupOrder extends BaseModel } return $params; } + + public function interest() + { + return $this->hasOne(StoreOrderInterest::class, 'group_order_id', 'group_order_id'); + } + } diff --git a/app/common/model/store/order/StoreOrderInterest.php b/app/common/model/store/order/StoreOrderInterest.php index 64cd7c14..4793a7ed 100644 --- a/app/common/model/store/order/StoreOrderInterest.php +++ b/app/common/model/store/order/StoreOrderInterest.php @@ -20,4 +20,16 @@ class StoreOrderInterest extends BaseModel return 'store_order_interest'; } + /** + * 计算利息 + * @return string + */ + public function calculateInterest() + { + $days = ceil((time() - strtotime($this->start_time)) / 86400); + $days = max($days ,0); + $money = bcmul($this->total_price, $this->rate, 2); + return bcmul($days, $money, 2); + } + } diff --git a/app/common/repositories/store/order/StoreOrderInterestRepository.php b/app/common/repositories/store/order/StoreOrderInterestRepository.php index dd024ead..fdfecf52 100644 --- a/app/common/repositories/store/order/StoreOrderInterestRepository.php +++ b/app/common/repositories/store/order/StoreOrderInterestRepository.php @@ -15,4 +15,14 @@ class StoreOrderInterestRepository extends BaseRepository return $model->insert($data); } + public function getByGroupOrder($groupOrderId) + { + return StoreOrderInterest::where('group_order_id', $groupOrderId)->find(); + } + + public function getByOrder($orderId) + { + return StoreOrderInterest::where('order_id', $orderId)->find(); + } + } diff --git a/app/common/repositories/store/order/StoreOrderRepository.php b/app/common/repositories/store/order/StoreOrderRepository.php index 35490fe1..d5632846 100644 --- a/app/common/repositories/store/order/StoreOrderRepository.php +++ b/app/common/repositories/store/order/StoreOrderRepository.php @@ -14,6 +14,7 @@ namespace app\common\repositories\store\order; use app\common\dao\store\order\StoreOrderDao; use app\common\model\store\order\StoreGroupOrder; use app\common\model\store\order\StoreOrder; +use app\common\model\store\order\StoreOrderInterest; use app\common\model\user\User; use app\common\repositories\BaseRepository; use app\common\repositories\delivery\DeliveryOrderRepository; @@ -2426,4 +2427,69 @@ class StoreOrderRepository extends BaseRepository return true; } + /** + * 订单结算 + * @param $id + * @param $type + * @param $user + * @return array + * @throws Exception + */ + public function settle($id, $type, $user) + { + /** @var StoreGroupOrderRepository $groupOrderRepository */ + $groupOrderRepository = app()->make(StoreGroupOrderRepository::class); + $groupOrderRepository->getAll = true; + Db::startTrans(); + try { + $groupOrder = $groupOrderRepository->detail($user['uid'], $id, false); + if (!$groupOrder) { + throw new Exception('订单不存在或已支付'); + } + if (!$groupOrder->interest || $groupOrder->interest->status == StoreOrderInterest::STATUS_SETTLED) { + throw new Exception('订单无需结算'); + } + $interest = $groupOrder->interest->calculateInterest(); + $payMoney = bcadd($groupOrder->interest->total_price, $interest, 2); + $result = true; + $data = ['type' => $type, 'order_id' => $groupOrder->group_order_id, 'paid' => true]; + if ($payMoney > 0) { + if (!in_array($type, ['balance', 'scrcu'])) { + if (systemConfig('open_wx_combine')) { + $service = new CombinePayService($type, $groupOrder->getCombinePayParams()); + } else { + $service = new PayService($type, $groupOrder->getPayParams($type === 'alipay' ? request()->param('return_url') : '')); + } + $result = $service->pay($user); + $data = array_merge($data, $result, ['paid' => false]); + } else { + $payTool = PayTool::instance($type); + $groupOrder->pay_price = $payMoney; + $result = $payTool->pay($groupOrder); + } + } + if ($result === true) { + $groupOrder->interest->status = StoreOrderInterest::STATUS_SETTLED; + $groupOrder->interest->settle_time = date('Y-m-d H:i:s'); + $groupOrder->interest->save(); + + /** @var UserBillRepository $userBillRepository */ + $userBillRepository = app()->make(UserBillRepository::class); + $userBillRepository->decBill($user['uid'], 'now_money', 'pay_product', [ + 'link_id' => $groupOrder['group_order_id'], + 'status' => 1, + 'title' => '购买商品', + 'number' => $groupOrder['pay_price'], + 'mark' => '余额支付支付' . floatval($groupOrder['pay_price']) . '元购买商品', + 'balance' => $user->now_money + ]); + } + Db::commit(); + return $data; + } catch (\Exception $e) { + Db::rollback(); + throw new Exception($e->getMessage()); + } + } + } diff --git a/app/controller/api/store/order/StoreOrder.php b/app/controller/api/store/order/StoreOrder.php index fb441cca..52981133 100644 --- a/app/controller/api/store/order/StoreOrder.php +++ b/app/controller/api/store/order/StoreOrder.php @@ -298,4 +298,22 @@ class StoreOrder extends BaseController $res = $orderRepository->show($id, $this->request->uid()); return app('json')->success($res); } + + /** + * 订单结算 + * @return mixed + * @throws \Psr\SimpleCache\InvalidArgumentException + */ + public function settle() + { + $id = $this->request->param('id/d'); + $type = $this->request->param('type'); + try { + $data = $this->repository->settle($id, $type, $this->request->userInfo()); + return app('json')->success('success', $data); + } catch (\Exception $e) { + return app('json')->fail($e->getMessage()); + } + } + } diff --git a/crmeb/services/payTool/Balance.php b/crmeb/services/payTool/Balance.php new file mode 100644 index 00000000..b7d0bd25 --- /dev/null +++ b/crmeb/services/payTool/Balance.php @@ -0,0 +1,82 @@ +userInfo(); + if (!systemConfig('yue_pay_status')) { + throw new \Exception('未开启余额支付'); + } + if ($user['now_money'] < $order['pay_price']) { + throw new \Exception('余额不足,请更换支付方式'); + } + $user->now_money = bcsub($user->now_money, $order['pay_price'], 2); + if (!$user->save()) { + throw new \Exception('用户余额扣减失败'); + } + return true; + } + + /** + * 查询 + * @param $order + * @return string + * @throws \Exception + */ + public function query($order) + { + } + + /** + * 退款 + * @param $order + * @return string + * @throws \Exception + */ + public function refund($order) + { + } + + /** + * 发起请求 + * @param $body + * @return string + * @throws \Exception + */ + public function request($body) + { + } + + public function success() + { + } + + public function callback($request = null) + { + } + + public function refundQuery($refundOrder) + { + } + + public function transfer($withdraw) + { + } + +} \ No newline at end of file diff --git a/crmeb/services/payTool/PayTool.php b/crmeb/services/payTool/PayTool.php index 657d09fc..ff29b32b 100644 --- a/crmeb/services/payTool/PayTool.php +++ b/crmeb/services/payTool/PayTool.php @@ -7,21 +7,16 @@ abstract class PayTool public $config; public $error = ['success' => false]; - const Scrcu = 'scrcu'; - - const ClassMap = [ - self::Scrcu => Scrcu::class, - ]; /** * @param $name * @param $params - * @return mixed|Scrcu + * @return mixed|PayTool * @throws \Exception */ public static function instance($name, $params = []) { - $class = self::ClassMap[$name]; + $class = 'crmeb\services\payTool\\' . ucfirst($name); if (class_exists($class)) { return new $class($params); } diff --git a/route/api.php b/route/api.php index 144ef46f..72ba6e29 100644 --- a/route/api.php +++ b/route/api.php @@ -90,6 +90,7 @@ Route::group('api/', function () { Route::get('verify_code/:id', '/verifyCode'); Route::post('receipt/:id', '/createReceipt'); Route::get('delivery/:id', '/getOrderDelivery'); + Route::post('settle', '/settle'); })->prefix('api.store.order.StoreOrder'); // 预售