Parcourir la source

feat(lakala): 实现分账订单审批与余额分离功能

- 引入SACSService和Config依赖以支持分账操作
- 修改approve方法逻辑,使用事务处理分账请求
- 调整余额检查条件,从total_amt改为separate_value
- 集成拉卡拉API进行余额分离操作
- 更新SACSService中的响应处理逻辑,统一异常抛出方式
- 移除调试打印代码,增强生产环境稳定性
runphp il y a 3 mois
Parent
commit
48658993df
2 fichiers modifiés avec 43 ajouts et 26 suppressions
  1. 28 6
      src/Controller/Admin/ProfitShareOrderController.php
  2. 15 20
      src/Service/SACSService.php

+ 28 - 6
src/Controller/Admin/ProfitShareOrderController.php

@@ -5,9 +5,12 @@ namespace SixShop\Lakala\Controller\Admin;
 use SixShop\Balpay\Entity\ExtensionBalpayLogEntity;
 use SixShop\Balpay\Enum\BalpayLogTypeEnum;
 use SixShop\Core\Request;
+use SixShop\Lakala\Config;
 use SixShop\Lakala\Entity\ProfitShareOrderEntity;
 use SixShop\Lakala\Enum\ProfitShareOrderStatusEnum;
 use SixShop\Lakala\Service\LaepIndustryService;
+use SixShop\Lakala\Service\SACSService;
+use think\facade\Db;
 use think\Response;
 use function SixShop\Core\page_response;
 use function SixShop\Core\success_response;
@@ -39,8 +42,9 @@ class ProfitShareOrderController
     public function approve(
         int $id,
         ProfitShareOrderEntity $profitShareOrderEntity,
-        ExtensionBalpayLogEntity $extensionBalpayLogEntity,
-        LaepIndustryService $laepIndustryService
+        LaepIndustryService $laepIndustryService,
+        SACSService $sacsService,
+        Config $config,
     ): Response
     {
         $entity = $profitShareOrderEntity->where(['id' => $id, 'status' => ProfitShareOrderStatusEnum::PENDING])->findOrEmpty();
@@ -59,12 +63,30 @@ class ProfitShareOrderController
                 default => '商户账户异常'
             });
         }
+        // 只分给分账接收方
         $curBalance = (int)round($balance->curBalance * 100,0);
-        if ($curBalance < $entity->total_amt) {
-            throw_logic_exception('商户余额不足');
+        if ($curBalance < $entity->separate_value) {
+            throw_logic_exception('分账商户余额不足');
         }
-        $entity->status = ProfitShareOrderStatusEnum::PROCESSING;
-        $entity->save();
+        Db::transaction(function () use ($entity, $sacsService, $config){
+            $response = $sacsService->balanceSeparate([
+                'merchant_no' => $entity->merchant_no,
+                'out_separate_no' => $entity->out_separate_no,
+                'total_amt' => $entity->separate_value,
+                'lkl_org_no' => $entity->lkl_org_no,
+                'cal_type' => '0', // 分账计算类型 0- 按照指定金额,1- 按照指定比例
+                'notify_url' => $config->notify_url,
+                'recv_datas' => [
+                    [
+                        'recv_no' => $entity->recv_no,
+                        'separate_value' => $entity->separate_value,
+                    ]
+                ]
+            ]);
+            $entity->separate_no = $response->separate_no;
+            $entity->status = ProfitShareOrderStatusEnum::PROCESSING;
+            $entity->save();
+        });
 
         return success_response($entity);
     }

+ 15 - 20
src/Service/SACSService.php

@@ -6,6 +6,7 @@ use SixShop\Lakala\Config;
 use SixShop\Lakala\OpenAPISDK\V2\Api\V2LakalaApi;
 use SixShop\Lakala\OpenAPISDK\V3\Api\LakalaApi;
 use SixShop\Lakala\OpenAPISDK\V3\Model\ModelRequest;
+use function SixShop\Core\throw_logic_exception;
 
 class SACSService
 {
@@ -26,18 +27,15 @@ class SACSService
         $request = new ModelRequest();
         $request->setReqData($reqData);
         $response = $this->lakalaApi->tradeApi('/api/v3/sacs/balanceSeparate', $request);
-        if ($response->getRespData()) {
-            print_r($response->getRespData());
+        if ($response->getCode() == 'SACS0000') {
+            return $response->getRespData();
         } else {
-            print_r($response);
+            throw_logic_exception(
+                msg: $response->getMsg(),
+                status: $response->getCode(),
+                data: $response->getRespData(),
+            );
         }
-        echo $response->getRetCode();
-
-        # 响应头信息
-        print_r($response->getHeaders());
-
-        # 响应原文
-        echo $response->getOriginalText();
     }
 
     /**
@@ -62,17 +60,14 @@ class SACSService
         }
         $request->setReqData($reqData);
         $response = $this->lakalaApi->tradeApi('/api/v3/sacs/balanceSeparateQuery', $request);
-        if ($response->getRespData()) {
-            print_r($response->getRespData());
+        if ($response->getCode() == 'SACS0000') {
+            return $response->getRespData();
         } else {
-            print_r($response);
+            throw_logic_exception(
+                msg: $response->getMsg(),
+                status: $response->getCode(),
+                data: $response->getRespData(),
+            );
         }
-        echo $response->getRetCode();
-
-        # 响应头信息
-        print_r($response->getHeaders());
-
-        # 响应原文
-        echo $response->getOriginalText();
     }
 }