Просмотр исходного кода

feat(lakala): 新增微信支付订单管理功能

- 创建拉卡拉微信支付数据表及字段定义
- 添加微信交易号与订单状态相关字段至订单列表页
- 实现订单状态枚举类及其文本映射逻辑
- 在支付记录服务中集成微信支付订单查询与创建逻辑
- 自动补充缺失的微信支付订单信息并显示状态文本
- 更新前端展示界面以支持新增的微信支付字段显示
runphp 4 месяцев назад
Родитель
Сommit
5d1a3fb35f

+ 34 - 0
database/migrations/20251120070536_lakala_wechat_payment.php

@@ -0,0 +1,34 @@
+<?php
+
+declare(strict_types=1);
+
+use Phinx\Migration\AbstractMigration;
+
+final class LakalaWechatPayment extends AbstractMigration
+{
+    /**
+     * Change Method.
+     *
+     * Write your reversible migrations using this method.
+     *
+     * More information on writing migrations is available here:
+     * https://book.cakephp.org/phinx/0/en/migrations.html#the-change-method
+     *
+     * Remember to call "create()" or "update()" and NOT "save()" when working
+     * with the Table class.
+     */
+    public function change(): void
+    {
+        $this->table('lakala_wechat_payment', ['comment' => '拉卡拉微信支付表', 'signed' => false])
+            ->addColumn('payment_id', 'integer', ['signed' => false,'comment' => '支付ID'])
+            ->addColumn('wechat_transaction_id', 'string', ['comment' => '微信交易ID'])
+            ->addColumn('order_state', 'tinyinteger', ['signed' => false,'comment' => '订单状态枚举:(1) 待发货;(2) 已发货;(3) 确认收货;(4) 交易完成;(5) 已退款;(6) 资金待结算。'])
+            ->addColumn('goods_desc', 'string', ['limit' => 255,'comment' => '商品描述'])
+            ->addColumn('express_company', 'string', ['limit' => 32,'comment' => '快递公司ID'])
+            ->addColumn('express_company_name', 'string', ['limit' => 64,'comment' => '快递公司名称'])
+            ->addTimestamps('create_time', 'update_time')
+            ->addIndex(['payment_id'], ['name' => 'idx_payment_id', 'unique' => true])
+            ->addIndex(['wechat_transaction_id'], ['name' => 'idx_wechat_transaction_id', 'unique' => true])
+            ->create();
+    }
+}

+ 2 - 0
resource/admin/TradeOrder.vue

@@ -52,11 +52,13 @@
         <el-table-column prop="order_sn" label="订单编号" width="180" />
         <el-table-column prop="out_trade_no" label="商户支付订单号" min-width="200" />
         <el-table-column prop="transaction_id" label="拉卡拉交易号" min-width="250" />
+        <el-table-column prop="wechat_transaction_id" label="微信交易号" min-width="250" />
         <el-table-column prop="amount" label="支付金额(元)" width="120" align="right">
           <template #default="{ row }">
             <span class="amount-highlight">{{ formatAmount(row.amount) }}</span>
           </template>
         </el-table-column>
+        <el-table-column prop="order_state_text" label="状态" width="100" />
         <el-table-column label="快递信息" min-width="250">
           <template #default="{ row }">
             <div class="express-info">

+ 49 - 0
src/Enum/WechatOrderStateEnum.php

@@ -0,0 +1,49 @@
+<?php
+declare(strict_types=1);
+namespace SixShop\Lakala\Enum;
+
+enum WechatOrderStateEnum:int
+{
+    /**
+     * 待发货
+     */
+    case PENDING_SHIPMENT = 1;
+
+    /**
+     * 已发货
+     */
+    case SHIPPED = 2;
+
+    /**
+     * 确认收货
+     */
+    case CONFIRM_RECEIPT = 3;
+
+    /**
+     * 交易完成
+     */
+    case TRADE_COMPLETED = 4;
+
+    /**
+     * 已退款
+     */
+    case REFUNDED = 5;
+
+    /**
+     * 资金待结算
+     */
+    case FUNDS_PENDING_SETTLEMENT = 6;
+
+    public function toString(): string
+    {
+        return match ($this) {
+            self::PENDING_SHIPMENT => '待发货',
+            self::SHIPPED => '已发货',
+            self::CONFIRM_RECEIPT => '确认收货',
+            self::TRADE_COMPLETED => '交易完成',
+            self::REFUNDED => '已退款',
+            self::FUNDS_PENDING_SETTLEMENT => '资金待结算',
+            default => '未知状态',
+        };
+    }
+}

+ 24 - 0
src/Model/LakalaWechatPaymentModel.php

@@ -0,0 +1,24 @@
+<?php
+declare(strict_types=1);
+namespace SixShop\Lakala\Model;
+
+use SixShop\Lakala\Enum\WechatOrderStateEnum;
+use think\Model;
+
+class LakalaWechatPaymentModel extends Model
+{
+    protected function getOptions(): array
+    {
+        return [
+            'name' => 'lakala_wechat_payment',
+            'type' => [
+                'order_state' => WechatOrderStateEnum::class,
+            ]
+        ];
+    }
+
+    public function getOrderStateTextAttr($value, $data)
+    {
+        return $data['order_state']->toString();
+    }
+}

+ 41 - 4
src/Service/PaymentRecordService.php

@@ -1,19 +1,24 @@
 <?php
 declare(strict_types=1);
+
 namespace SixShop\Lakala\Service;
 
+use app\model\OrderGoods;
+use SixShop\Lakala\Enum\WechatOrderStateEnum;
+use SixShop\Lakala\Model\LakalaWechatPaymentModel;
 use SixShop\Payment\Model\ExtensionPaymentModel;
 use think\db\Query;
 use think\Paginator;
 
 class PaymentRecordService
 {
-    public function getTradeOrderList(array $params, array $pageAndLimit):Paginator
+    public function getTradeOrderList(array $params, array $pageAndLimit): Paginator
     {
-        return ExtensionPaymentModel::alias('p')
+        $paginator = ExtensionPaymentModel::alias('p')
             ->leftJoin('order o', 'o.id = p.order_id')
+            ->leftJoin('lakala_wechat_payment w', 'p.id = w.payment_id')
             ->where([
-                'p.pay_type' =>'lakala',
+                'p.pay_type' => 'lakala',
                 'p.status' => 2
             ])
             ->when($params['order_sn'], function (Query $query) use ($params) {
@@ -26,7 +31,12 @@ class PaymentRecordService
                 $query->whereLike('p.transaction_id', '%' . $params['transaction_id'] . '%');
             })
             ->field([
-                'p.*', 'o.express_name', 'o.express_number',
+                'p.id',
+                'p.order_sn',
+                'p.out_trade_no',
+                'p.transaction_id',
+                'p.amount',
+                'o.express_name', 'o.express_number',
                 'o.shipping_status',
                 'o.consignee',
                 'o.mobile',
@@ -34,8 +44,35 @@ class PaymentRecordService
                 'o.city',
                 'o.district',
                 'o.address',
+                'w.wechat_transaction_id',
+                'w.order_state',
+                'w.goods_desc',
             ])
             ->order('p.id', 'DESC')
             ->paginate($pageAndLimit);
+        $paginator->each(function (ExtensionPaymentModel $item) {
+           if ($item['order_state'] == null) {
+               $wechatOrder = $this->createWechatOrder($item->id);
+               $item->setAttrs([
+                   'wechat_transaction_id' => $wechatOrder['wechat_transaction_id'],
+                   'order_state' => $wechatOrder['order_state'],
+                   'goods_desc' => $wechatOrder['goods_desc'],
+               ]);
+           }
+           $item->setAttr('order_state_text', WechatOrderStateEnum::from($item['order_state'])->toString());
+        });
+        return $paginator;
+    }
+
+    private function createWechatOrder(int $paymentID):LakalaWechatPaymentModel
+    {
+        $payment = ExtensionPaymentModel::find($paymentID);
+        $goods = OrderGoods::where(['order_id' => $payment['order_id']])->find();
+        return LakalaWechatPaymentModel::create([
+            'payment_id' => $payment['id'],
+            'wechat_transaction_id' => $payment['payment_result']['acc_trade_no'],
+            'order_state' => WechatOrderStateEnum::PENDING_SHIPMENT,
+            'goods_desc' => $goods['goods_name'],
+        ]);
     }
 }