Zory 3 viikkoa sitten
vanhempi
sitoutus
cc0fff219d

+ 1 - 0
app/controller/api/Notify.php

@@ -127,6 +127,7 @@ class Notify extends Base
                     (new SaasOrderItem)->where("item_order_id",$val['item_order_id'])->update(['status' => 2]);
                 }
             }
+            (new SaasGoods)->where("goods_id",$order['life_goods_id'])->dec("sale_stock")->save();
             $order->refund_at = getDateFull();
             $order->save();
             return json(['err_no' => 0,'err_tips' => "success"]);

+ 4 - 3
app/controller/api/Solution.php

@@ -67,13 +67,14 @@ class Solution extends Base
                     case "pre_create_refund": // 退款回调
                         $order = (new SaasOrder)->where("order_sn",$msgData['order_id'])->findOrEmpty();
                         if ($order->isEmpty()) return json(['err_no' => 0,"err_tips" => "success"]);
-//                        if (!in_array($order['status'],[1,6])) return json(['err_no' => 0,"err_tips" => "success"]);
+                        if (!in_array($order['status'],[1,6])) return json(['err_no' => 0,"err_tips" => "success"]);
                         $order->status = 4; // 退款中
                         $order->refund_msg = json_encode($msgData['refund_reason']);
                         $order->refund_apply = getDateFull();
                         $order->save();
                         // 推送审核机制
-
+                        echo getDateFull()."===推送审核\n";
+                        Redis::send("audit-order",['order' => $msgData['order_id']],60);
                         return json(['err_no' => 0,"err_tips" => "success","data" => [
                             "out_refund_no" => "R".$order['out_order_no'],
                             "order_entry_schema"    => [
@@ -102,7 +103,7 @@ class Solution extends Base
                         $orderSn = "AL".CodeExtend::uniqidDate(18).rand(100,999);
                         $goodsImg = is_string($goods['image_list'])?json_decode($goods['image_list'],true):$goods['image_list'];
                         $order->insertGetId([
-                            "out_order_no"  => $orderSn,
+                            "out_order_no"  => "AL".$msgData['order_id'],
                             "item_order_id" => $msgData['item_order_info_list'][0]['item_order_id']?:'0',
                             "order_sn"  => $msgData['order_id'],
                             "openid"    => $msgData['open_id'],

+ 1 - 1
app/controller/merchant/GoodsOff.php

@@ -34,7 +34,7 @@ class GoodsOff extends Base
             $data = $this->service->setModel()->getList($param,['store' => function($query){
                 $query->field("poi_id,poi_name,poi_address,poi_city");
             },'goods' => function($query){
-                $query->field("goods_id,image_list,product_name,price,line_price");
+                $query->field("goods_id,image_list,product_name,price,line_price,is_new");
             }]);
             return successTrans("success.data",pageFormat($data),200);
         } catch (\Throwable $throwable) {

+ 53 - 1
app/controller/merchant/Order.php

@@ -251,6 +251,54 @@ class Order extends Base
         }
     }
 
+    #[PostMapping('address/edit')]
+    public function editOrderAddress(Request $request): Response
+    {
+        try {
+            $param = $this->_valid([
+                "nickname.require"      => trans("empty.require"),
+                "mobile.require"        => trans("empty.require"),
+                "mobile.mobile"         => trans("error.mobile"),
+                "city.require"          => trans("empty.require"),
+                "address.require"       => trans("empty.require"),
+                "goods.require"         => trans("empty.require"),
+                "cityLabel.default"     => "",
+                "id.require"            => trans("empty.require"),
+            ],$request->method());
+            if (!is_array($param)) return error($param);
+            $address = (new SaasOrderAddress)->where("id",$param["id"])->findOrEmpty();
+            if ($address->isEmpty()) return error("数据不存在");
+            if (!empty($param['cityLabel'])) {
+                $param['city_text'] = implode("",$param['cityLabel']);
+            }
+            $goodsJson = json_decode($param['goods'],true);
+            $param['goods'] = $goodsJson[0]['id'];
+            $param['city_code'] = empty($param['city'])?[]:json_encode($param['city']);
+            $state = $address->setAutoData($param);
+            if (!$state) return errorTrans("error.data");
+            return successTrans("success.data");
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+    #[GetMapping('address/detail')]
+    public function getOrderAddress(Request $request): Response
+    {
+        try {
+            $param = $this->_valid([
+                "order.require"    => trans("empty.require")
+            ],$request->method());
+            if (!is_array($param)) return error($param);
+            $detail = (new SaasOrderAddress)->where("order_sn",$param['order'])->with(['goods','orders' => function($query){
+                $query->field("out_order_no,life_goods_id");
+            }])->findOrEmpty();
+            if ($detail->isEmpty()) return error("该订单尚未预约");
+            return successTrans("success.data",$detail->toArray());
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
 
     #[PostMapping('address')]
     public function setOrderAddress(Request $request): Response
@@ -264,6 +312,7 @@ class Order extends Base
                 "address.require"       => trans("empty.require"),
                 "cityLabel.require"     => trans("empty.require"),
                 "order.require"         => trans("empty.require"),
+                "goods.require"         => trans("empty.require"),
             ],$request->method());
             if (!is_array($param)) return error($param);
             $order = (new SaasOrder)->where("out_order_no",$param["order"])->with(['poi'])->findOrEmpty();
@@ -272,6 +321,8 @@ class Order extends Base
             $address = (new SaasOrderAddress)->where(['openid' => $order['openid'],'order_sn' => $param['order']])->findOrEmpty();
             if (!$address->isEmpty()) return error("请勿重复提交");
             $param['city_text'] = empty($param['cityLabel'])?'':implode("",$param['cityLabel']);
+            $goodsJson = json_decode($param['goods'],true);
+            $param['goods'] = $goodsJson[0]['id'];
             $address->insertGetId([
                 "openid"    => $order['openid'],
                 "order_sn"  => $param['order'],
@@ -280,8 +331,9 @@ class Order extends Base
                 "mobile"    => $param['mobile'],
                 "address"   => $param['address'],
                 "nickname"  => $param['nickname'],
+                "goods"     => $param['goods'],
             ]);
-            $order->status = 2;
+            $order->status = 7;
             $order->express_status = 1;
             $state = $order->save();
             if (!$state) return errorTrans("error.data");

+ 14 - 0
app/controller/notify/Test.php

@@ -123,4 +123,18 @@ class Test extends Base
         }
     }
 
+    #[GetMapping('mini/token')]
+    public function testToken()
+    {
+        try {
+            $resp = (new OrderData)->config([
+                "appid"     => sConf("wechat.mini_appid"),
+                "secret"    => sConf("wechat.mini_secret"),
+            ])->token()->getAccessToken();
+            return success('ok',['data' => $resp]);
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
 }

+ 15 - 0
app/extra/dyLife/data/OrderData.php

@@ -160,4 +160,19 @@ class OrderData extends BasicLife
         return $this->curlPostApi("api/apps/trade/v2/fulfillment/push_delivery/",$param);
     }
 
+    /**
+     * 退款审核推送
+     * https://developer.open-douyin.com/docs/resource/zh-CN/mini-app/develop/server/locallife/general-ability/agency-trade-system/refund/audit-callback
+     * @param array $data
+     * @return array
+     */
+    public function auditOrder(array $data = []): array
+    {
+        $param = [
+            "out_refund_no"         => "R".$data['out_order_no'],
+            "refund_audit_status"   => 1
+        ];
+        return $this->curlPostApi("api/apps/trade/v2/refund/merchant_audit_callback",$param);
+    }
+
 }

+ 4 - 0
app/model/saas/SaasOrderAddress.php

@@ -52,5 +52,9 @@ class SaasOrderAddress extends Model
         return $this->hasOne(SaasGoodsOff::class,"id","goods");
     }
 
+    public function orders(): HasOne
+    {
+        return $this->hasOne(SaasOrder::class,"out_order_no","order_sn");
+    }
 
 }

+ 49 - 0
app/queue/redis/slow/AuditOrder.php

@@ -0,0 +1,49 @@
+<?php
+
+namespace app\queue\redis\slow;
+
+use app\extra\dyLife\data\OrderData;
+use app\model\saas\SaasOrder;
+use Webman\RedisQueue\Consumer;
+
+class AuditOrder implements Consumer
+{
+
+
+    /**
+     * 退款审核
+     * @var string
+     */
+    public string $queue = "audit-order";
+
+    /**
+     * 连接配置
+     * @var string
+     */
+    public string $connection = "default";
+
+
+    public function consume($data): bool
+    {
+        try {
+            echo getDateFull()."===执行推送\n";
+            if(empty($data['order'])) return true;
+            $order = (new SaasOrder)->where("order_sn",$data['order'])->findOrEmpty();
+            if ($order->isEmpty()) return true;
+            if (!in_array($order['status'],[1,6,4])) return true;
+            $resp = (new OrderData)->config([
+                "appid"     => sConf("wechat.mini_appid"),
+                "secret"    => sConf("wechat.mini_secret"),
+            ])->token()->auditOrder($order->toArray());
+            echo getDateFull()."==={$data['order']}===退款审核推送\n";
+            print_r($resp);
+            return true;
+        } catch (\Throwable $throwable) {
+            echo getDateFull()."==推送退款审核报错===\n";
+            echo $throwable->getFile()."\n";
+            echo $throwable->getLine()."\n";
+            echo $throwable->getMessage()."\n";
+        }
+        return true;
+    }
+}

+ 1 - 1
app/queue/redis/slow/ExportOrder.php

@@ -80,7 +80,7 @@ class ExportOrder implements Consumer
                 $newData = [
                     "shop"      => $item['poi']['poi_name']??'-', // 店铺名称
                     "nickname"  => $item['user']['nickname']??'-', // 下单人昵称
-                    "order"     => $item['order_sn']??'-', // 订单编号
+                    "order"     => $item['out_order_no']??'-', // 订单编号
                     "status"    => $this->status[$item['status']], // 订单状态
                     "express"   => $this->express[$item['express_status']], // 订单状态
                     "user"      => $item['address']['nickname']??'-',

+ 9 - 4
app/queue/redis/slow/ImportOrder.php

@@ -7,6 +7,7 @@ use app\model\saas\SaasOrder;
 use app\model\saas\SaasOrderExpress;
 use app\model\system\SystemImport;
 use app\model\system\SystemUser;
+use PhpOffice\PhpSpreadsheet\Cell\DataType;
 use PhpOffice\PhpSpreadsheet\IOFactory;
 use Webman\RedisQueue\Consumer;
 
@@ -44,11 +45,11 @@ class ImportOrder implements Consumer
                     $excelData[$rowIndex] = $row;
                 }
             }
+            $successData = $errData = [];
             if (!empty($excelData)) {
-                $successData = $errData = [];
                 foreach (array_values(array_filter($excelData)) as $key=>$val) {
                     if (!empty(trim($val['C'])) && !empty(trim($val['A']))) {
-                        $order = $orderMode->where("order_sn",trim($val['A']))->findOrEmpty();
+                        $order = $orderMode->where("out_order_no",trim($val['A']))->findOrEmpty();
                         if ($order->isEmpty()) {
                             continue;
                         }
@@ -89,19 +90,23 @@ class ImportOrder implements Consumer
                         } else {
                             $errData[$key] = trim($val['A']);
                         }
+                    } else {
+                        $errData[$key] = trim($val['A']);
                     }
                 }
             }
             if (!empty($expressData)) {
                 (new SaasOrderExpress)->insertAll(array_values($expressData));
             }
+            print_r($successData);
+            print_r($errData);
             (new SystemImport)->where("id",$data['logId'])->update([
                 'status'        => 1,
                 "last_at"       => getDateFull(),
                 'success_num'   => (!empty($successData)) ? count(array_values($successData)) : 0,
-                'success_data'  => (!empty($successData)) ? json_encode(array_values($successData)) : "",
+                'success_data'  => (!empty($successData)) ? json_encode(array_values($successData)) : [],
                 'error_num'     => (!empty($errData)) ? count(array_values($errData)) : 0,
-                'error_data'    => (!empty($errData)) ? json_encode(array_values($errData)) : '[]',
+                'error_data'    => (!empty($errData)) ? json_encode(array_values($errData)) : [],
             ]);
             return true;
         } catch (\Throwable $throwable) {

+ 1 - 0
app/service/saas/GoodsOffService.php

@@ -30,6 +30,7 @@ class GoodsOffService extends Service
         $filter = [];
         !empty($param['status']) && $filter[] = ["status", '=', ($param['status']-1)];
         !empty($param['poi']) && $filter[] = ["poi_id", '=', $param['poi']];
+        !empty($param['goods']) && $filter[] = ["goods_id", '=', $param['goods']];
         !empty($param['is_deleted']) && $filter[] = ["is_deleted", '=', $param['is_deleted']];
         !empty($param['poi_id']) && $filter[] = ["poi_id", '=', $param['poi_id']];
         !empty($param['title']) && $filter[] = ["title", 'like', "%{$param['title']}%"];

+ 0 - 0
public/download/~$订单列表_1787653541761.xlsx


+ 0 - 0
public/download/~$订单列表_1787654041465.xlsx


BIN
public/download/订单列表_1785124583217.xlsx


BIN
public/download/订单列表_1787653541761.xlsx


BIN
public/download/订单列表_1787654041465.xlsx


BIN
public/uploads/storage/20260826/87095cb6def1d5d2c82ba62ab06b613918b11b11.xlsx


BIN
public/uploads/storage/20260826/bc0395ed9b5252b4986832df0c67383e52d5adb5.xlsx